如何使用OpenSSL生成自签名SSL证书?

如何使用OpenSSL生成自签名SSL证书?,ssl,openssl,certificate,ssl-certificate,x509certificate,Ssl,Openssl,Certificate,Ssl Certificate,X509certificate,我正在向嵌入式Linux设备添加HTTPS支持。我已尝试使用以下步骤生成自签名证书: openssl req -new > cert.csr openssl rsa -in privkey.pem -out key.pem openssl x509 -in cert.csr -out cert.pem -req -signkey key.pem -days 1001 cat key.pem>>cert.pem 这是可行的,但我在Google Chrome上遇到了一些错误: 这

我正在向嵌入式Linux设备添加HTTPS支持。我已尝试使用以下步骤生成自签名证书:

openssl req -new > cert.csr
openssl rsa -in privkey.pem -out key.pem
openssl x509 -in cert.csr -out cert.pem -req -signkey key.pem -days 1001
cat key.pem>>cert.pem
这是可行的,但我在Google Chrome上遇到了一些错误:

这可能不是你要找的网站
该站点的安全证书不受信任


我错过什么了吗?这是生成自签名证书的正确方法吗?

您可以通过一个命令完成此操作:

openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365
如果不想使用密码短语保护私钥,还可以添加
-节点
(缩写为
no DES
)。否则,它将提示您输入“至少4个字符”的密码

days
参数(365)可以替换为影响到期日期的任何数字。然后,它会提示您输入诸如“国家名称”之类的内容,但您只需按Enter键并接受默认值即可

添加
-subc'/CN=localhost'
以抑制有关证书内容的问题(用所需域替换
localhost


自签名证书不会与任何第三方进行验证,除非您以前将其导入浏览器。如果您需要更高的安全性,则应使用由(CA)签名的证书。

以下是中介绍的选项,详细说明如下:

PKCS#10证书请求和证书生成实用程序

-x509
此选项输出自签名证书,而不是证书请求。 这通常用于生成测试证书或自签名根CA

-newkey arg
此选项创建一个新的证书请求和一个新的私钥。争论 采取多种形式之一rsa:nbits,其中nbits是位数, 生成大小为nbits的RSA密钥

-keyout filename
这将提供用于写入新创建的私钥的文件名

-out filename
默认情况下,指定要写入的输出文件名或标准输出

-days n
当使用-x509选项时,该选项指定认证天数 这是我的证书。默认值为30天

-nodes
如果指定了此选项,则如果创建了私钥,则不会对其进行加密


文件实际上比上述文件更详细;我只是在这里进行了总结。

我建议添加-sha256参数,以使用SHA-2哈希算法,因为主要浏览器正在考虑将“SHA-1证书”显示为不安全

来自已接受答案的同一命令行-@diegows,添加了-sha256

openssl请求-x509-sha256-newkey rsa:2048-keyout key.pem-out cert.pem-days XXX

更多信息请参阅

2018年5月更新。许多人在评论中指出,使用SHA-2不会给自签名证书增加任何安全性。但我仍然建议使用它作为一个好习惯,不要使用过时/不安全的加密哈希函数。有关详细说明,请参阅

我错过什么了吗?这是构建自签名证书的正确方法吗

创建自签名证书很容易。您只需使用
openssl-req
命令。创建一个可供最大客户机选择(如浏览器和命令行工具)使用的客户端可能会很棘手

这很困难,因为浏览器有自己的一套需求,而且比浏览器更具限制性。浏览器所使用的需求记录在(见下面的参考资料)。限制出现在两个关键领域:(1)信任锚和(2)DNS名称

现代浏览器(如我们在2014/2015年使用的warez)需要一个链接回信任锚点的证书,并且他们希望DNS名称在证书中以特定方式显示。浏览器也在积极地对抗自签名服务器证书

#!/usr/bin/env bash

# Set the TLD domain we want to use
BASE_DOMAIN="example.com"

# Days for the cert to live
DAYS=1095

# A blank passphrase
PASSPHRASE=""

# Generated configuration file
CONFIG_FILE="config.txt"

cat > $CONFIG_FILE <<-EOF
[req]
default_bits = 2048
prompt = no
default_md = sha256
x509_extensions = v3_req
distinguished_name = dn

[dn]
C = CA
ST = BC
L = Vancouver
O = Example Corp
OU = Testing Domain
emailAddress = webmaster@$BASE_DOMAIN
CN = $BASE_DOMAIN

[v3_req]
subjectAltName = @alt_names

[alt_names]
DNS.1 = *.$BASE_DOMAIN
DNS.2 = $BASE_DOMAIN
EOF

# The file name can be anything
FILE_NAME="$BASE_DOMAIN"

# Remove previous keys
echo "Removing existing certs like $FILE_NAME.*"
chmod 770 $FILE_NAME.*
rm $FILE_NAME.*

echo "Generating certs for $BASE_DOMAIN"

# Generate our Private Key, CSR and Certificate
# Use SHA-2 as SHA-1 is unsupported from Jan 1, 2017

openssl req -new -x509 -newkey rsa:2048 -sha256 -nodes -keyout "$FILE_NAME.key" -days $DAYS -out "$FILE_NAME.crt" -passin pass:$PASSPHRASE -config "$CONFIG_FILE"

# OPTIONAL - write an info to see the details of the generated crt
openssl x509 -noout -fingerprint -text < "$FILE_NAME.crt" > "$FILE_NAME.info"

# Protect the key
chmod 400 "$FILE_NAME.key"
有些浏览器并不能很容易地导入自签名服务器证书。事实上,有些浏览器,比如安卓的浏览器,你无法使用。因此,完整的解决方案是成为你自己的权威

在没有成为您自己的权威的情况下,您必须获得正确的DNS名称,以使证书获得最大的成功机会。但我会鼓励你成为你自己的权威。它很容易成为你自己的权威,它会回避所有的信任问题(谁比你更值得信任?)


这可能不是你要找的网站
该站点的安全证书不受信任

这是因为浏览器使用预定义的信任锚列表来验证服务器证书。自签名证书不会链接回受信任的锚

避免这种情况的最佳方法是:

  • 创建自己的权威(即成为
  • 为服务器创建证书签名请求(CSR)
  • 使用CA密钥对服务器的CSR进行签名
  • 在服务器上安装服务器证书
  • 在客户端上安装CA证书
  • 步骤1-创建您自己的权限只是指创建一个具有
    CA:true
    和正确密钥用法的自签名证书。这意味着主体和颁发者是同一实体,CA在基本约束中设置为true(它也应标记为critical),密钥用法为
    keyCertSign
    crlSign
    (如果您使用的是CRLs),并且主体密钥标识符(SKI)与权限密钥标识符(AKI)相同

    要成为您自己的证书颁发机构,请参阅*关于堆栈溢出。然后,将CA导入浏览器使用的信任存储

    步骤2-4大致是您现在为一个面向公众的服务器所做的,当您登记CA(如或)的服务时。第1步和第5步允许您避开第三方权威,并充当您自己的权威(谁比您更值得信任?)

    避免浏览器警告的第二个最佳方法是t
    -nodes
    
    [ alternate_names ]
    
    DNS.1       = example.com
    DNS.2       = www.example.com
    DNS.3       = mail.example.com
    DNS.4       = ftp.example.com
    
    # Add these if you need them. But usually you don't want them or
    #   need them in production. You may need them for development.
    # DNS.5       = localhost
    # DNS.6       = localhost.localdomain
    # IP.1        = 127.0.0.1
    # IP.2        = ::1
    
    openssl req -config example-com.conf -new -x509 -sha256 -newkey rsa:2048 -nodes \
        -keyout example-com.key.pem -days 365 -out example-com.cert.pem
    
    openssl req -config example-com.conf -new -sha256 -newkey rsa:2048 -nodes \
        -keyout example-com.key.pem -days 365 -out example-com.req.pem
    
    openssl x509 -in example-com.cert.pem -text -noout
    
    openssl req -in example-com.req.pem -text -noout
    
    [ req ]
    default_bits        = 2048
    default_keyfile     = server-key.pem
    distinguished_name  = subject
    req_extensions      = req_ext
    x509_extensions     = x509_ext
    string_mask         = utf8only
    
    # The Subject DN can be formed using X501 or RFC 4514 (see RFC 4519 for a description).
    #   Its sort of a mashup. For example, RFC 4514 does not provide emailAddress.
    [ subject ]
    countryName         = Country Name (2 letter code)
    countryName_default     = US
    
    stateOrProvinceName     = State or Province Name (full name)
    stateOrProvinceName_default = NY
    
    localityName            = Locality Name (eg, city)
    localityName_default        = New York
    
    organizationName         = Organization Name (eg, company)
    organizationName_default    = Example, LLC
    
    # Use a friendly name here because it's presented to the user. The server's DNS
    #   names are placed in Subject Alternate Names. Plus, DNS names here is deprecated
    #   by both IETF and CA/Browser Forums. If you place a DNS name here, then you
    #   must include the DNS name in the SAN too (otherwise, Chrome and others that
    #   strictly follow the CA/Browser Baseline Requirements will fail).
    commonName          = Common Name (e.g. server FQDN or YOUR name)
    commonName_default      = Example Company
    
    emailAddress            = Email Address
    emailAddress_default        = test@example.com
    
    # Section x509_ext is used when generating a self-signed certificate. I.e., openssl req -x509 ...
    [ x509_ext ]
    
    subjectKeyIdentifier        = hash
    authorityKeyIdentifier    = keyid,issuer
    
    # You only need digitalSignature below. *If* you don't allow
    #   RSA Key transport (i.e., you use ephemeral cipher suites), then
    #   omit keyEncipherment because that's key transport.
    basicConstraints        = CA:FALSE
    keyUsage            = digitalSignature, keyEncipherment
    subjectAltName          = @alternate_names
    nsComment           = "OpenSSL Generated Certificate"
    
    # RFC 5280, Section 4.2.1.12 makes EKU optional
    #   CA/Browser Baseline Requirements, Appendix (B)(3)(G) makes me confused
    #   In either case, you probably only need serverAuth.
    # extendedKeyUsage    = serverAuth, clientAuth
    
    # Section req_ext is used when generating a certificate signing request. I.e., openssl req ...
    [ req_ext ]
    
    subjectKeyIdentifier        = hash
    
    basicConstraints        = CA:FALSE
    keyUsage            = digitalSignature, keyEncipherment
    subjectAltName          = @alternate_names
    nsComment           = "OpenSSL Generated Certificate"
    
    # RFC 5280, Section 4.2.1.12 makes EKU optional
    #   CA/Browser Baseline Requirements, Appendix (B)(3)(G) makes me confused
    #   In either case, you probably only need serverAuth.
    # extendedKeyUsage    = serverAuth, clientAuth
    
    [ alternate_names ]
    
    DNS.1       = example.com
    DNS.2       = www.example.com
    DNS.3       = mail.example.com
    DNS.4       = ftp.example.com
    
    # Add these if you need them. But usually you don't want them or
    #   need them in production. You may need them for development.
    # DNS.5       = localhost
    # DNS.6       = localhost.localdomain
    # DNS.7       = 127.0.0.1
    
    # IPv6 localhost
    # DNS.8     = ::1
    
    # IPv4 localhost
    # IP.1       = 127.0.0.1
    
    # IPv6 localhost
    # IP.2     = ::1
    
    openssl req -new -key {private key file} -out {output file}
    
    openssl genrsa -out server.key 2048
    openssl rsa -in server.key -out server.key
    openssl req -sha256 -new -key server.key -out server.csr -subj '/CN=localhost'
    openssl x509 -req -sha256 -days 365 -in server.csr -signkey server.key -out server.crt
    
    cat server.crt server.key > cert.pem
    
    sudo su -
    cd /etc/mysql
    openssl genrsa -out ca-key.pem 2048;
    openssl req -new -x509 -nodes -days 1000 -key ca-key.pem -out ca-cert.pem;
    openssl req -newkey rsa:2048 -days 1000 -nodes -keyout server-key.pem -out server-req.pem;
    openssl x509 -req -in server-req.pem -days 1000 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 -out server-cert.pem;
    openssl req -newkey rsa:2048 -days 1000 -nodes -keyout client-key.pem -out client-req.pem;
    openssl x509 -req -in client-req.pem -days 1000 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 -out client-cert.pem;
    
    [client]
    ssl-ca=/etc/mysql/ca-cert.pem
    ssl-cert=/etc/mysql/client-cert.pem
    ssl-key=/etc/mysql/client-key.pem
    
    [mysqld]
    ssl-ca=/etc/mysql/ca-cert.pem
    ssl-cert=/etc/mysql/server-cert.pem
    ssl-key=/etc/mysql/server-key.pem
    
    openssl rsa -in server-key.pem -out server-key.pem
    openssl rsa -in client-key.pem -out client-key.pem
    
    mysql -u root -p
    mysql> show variables like "%ssl%";
    +---------------+----------------------------+
    | Variable_name | Value                      |
    +---------------+----------------------------+
    | have_openssl  | YES                        |
    | have_ssl      | YES                        |
    | ssl_ca        | /etc/mysql/ca-cert.pem     |
    | ssl_capath    |                            |
    | ssl_cert      | /etc/mysql/server-cert.pem |
    | ssl_cipher    |                            |
    | ssl_key       | /etc/mysql/server-key.pem  |
    +---------------+----------------------------+
    
    show status like 'Ssl_cipher';
    
    mysql> show status like 'Ssl_cipher';
    +---------------+-------+
    | Variable_name | Value |
    +---------------+-------+
    | Ssl_cipher    |       |
    +---------------+-------+
    1 row in set (0.00 sec)
    
    mysql> show status like 'Ssl_cipher';
    +---------------+--------------------+
    | Variable_name | Value              |
    +---------------+--------------------+
    | Ssl_cipher    | DHE-RSA-AES256-SHA |
    +---------------+--------------------+
    1 row in set (0.00 sec)
    
    GRANT ALL PRIVILEGES ON test.* TO 'root'@'localhost'
      REQUIRE SSL;
    
    openssl req -x509 -newkey rsa:4096 -sha256 -days 3650 -nodes \
      -keyout example.key -out example.crt -subj "/CN=example.com" \
      -addext "subjectAltName=DNS:example.com,DNS:www.example.net,IP:10.0.0.1"
    
    openssl req -x509 -newkey rsa:4096 -sha256 -days 3650 -nodes \
      -keyout example.key -out example.crt -extensions san -config \
      <(echo "[req]"; 
        echo distinguished_name=req; 
        echo "[san]"; 
        echo subjectAltName=DNS:example.com,DNS:www.example.net,IP:10.0.0.1
        ) \
      -subj "/CN=example.com"
    
    [req]
    distinguished_name = req_distinguished_name
    x509_extensions = v3_req
    prompt = no
    [req_distinguished_name]
    C = US
    ST = VA
    L = SomeCity
    O = MyCompany
    OU = MyDivision
    CN = www.company.com
    [v3_req]
    keyUsage = critical, digitalSignature, keyAgreement
    extendedKeyUsage = serverAuth
    subjectAltName = @alt_names
    [alt_names]
    DNS.1 = www.company.com
    DNS.2 = company.com
    DNS.3 = company.net
    
    openssl req -x509 -nodes -days 730 -newkey rsa:2048 \
     -keyout cert.key -out cert.pem -config req.cnf -sha256
    
    #!/usr/bin/env bash
    
    # Set the TLD domain we want to use
    BASE_DOMAIN="example.com"
    
    # Days for the cert to live
    DAYS=1095
    
    # A blank passphrase
    PASSPHRASE=""
    
    # Generated configuration file
    CONFIG_FILE="config.txt"
    
    cat > $CONFIG_FILE <<-EOF
    [req]
    default_bits = 2048
    prompt = no
    default_md = sha256
    x509_extensions = v3_req
    distinguished_name = dn
    
    [dn]
    C = CA
    ST = BC
    L = Vancouver
    O = Example Corp
    OU = Testing Domain
    emailAddress = webmaster@$BASE_DOMAIN
    CN = $BASE_DOMAIN
    
    [v3_req]
    subjectAltName = @alt_names
    
    [alt_names]
    DNS.1 = *.$BASE_DOMAIN
    DNS.2 = $BASE_DOMAIN
    EOF
    
    # The file name can be anything
    FILE_NAME="$BASE_DOMAIN"
    
    # Remove previous keys
    echo "Removing existing certs like $FILE_NAME.*"
    chmod 770 $FILE_NAME.*
    rm $FILE_NAME.*
    
    echo "Generating certs for $BASE_DOMAIN"
    
    # Generate our Private Key, CSR and Certificate
    # Use SHA-2 as SHA-1 is unsupported from Jan 1, 2017
    
    openssl req -new -x509 -newkey rsa:2048 -sha256 -nodes -keyout "$FILE_NAME.key" -days $DAYS -out "$FILE_NAME.crt" -passin pass:$PASSPHRASE -config "$CONFIG_FILE"
    
    # OPTIONAL - write an info to see the details of the generated crt
    openssl x509 -noout -fingerprint -text < "$FILE_NAME.crt" > "$FILE_NAME.info"
    
    # Protect the key
    chmod 400 "$FILE_NAME.key"
    
                    ...
                    28:dd:b8:1e:34:b5:b1:44:1a:60:6d:e3:3c:5a:c4:
                    da:3d
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Subject Alternative Name: 
                DNS:*.example.com, DNS:example.com
    Signature Algorithm: sha256WithRSAEncryption
         3b:35:5a:d6:9e:92:4f:fc:f4:f4:87:78:cd:c7:8d:cd:8c:cc:
         ...
    
    <VirtualHost _default_:443>
        ServerName example.com
        ServerAlias www.example.com
        DocumentRoot /var/www/htdocs
    
        SSLEngine on
        SSLCertificateFile path/to/your/example.com.crt
        SSLCertificateKeyFile path/to/your/example.com.key
    </VirtualHost>
    
    openssl req -x509 \
     -nodes -days 365 -newkey rsa:4096 \
     -keyout self.key.pem \
     -out self-x509.crt \
     -subj "/C=US/ST=WA/L=Seattle/CN=example.com/emailAddress=someEmail@gmail.com"
    
    openssl req \
    -newkey rsa:2048 \
    -x509 \
    -nodes \
    -keyout server.pem \
    -new \
    -out server.pem \
    -subj /CN=localhost \
    -reqexts SAN \
    -extensions SAN \
    -config <(cat /System/Library/OpenSSL/openssl.cnf \
        <(printf '[SAN]\nsubjectAltName=DNS:localhost')) \
    -sha256 \
    -days 3650
    
    openssl req -x509 -nodes -sha256 -newkey rsa:2048 \
    -keyout localhost.key -out localhost.crt \
    -days 3650 \
    -subj "CN=localhost" \
    -reqexts SAN -extensions SAN \
    -config <(cat /etc/pki/tls/openssl.cnf <(printf "\n[SAN]\nsubjectAltName=IP:127.0.0.1,DNS:localhost"))
    
    openssl req -x509 -nodes -sha256 -newkey rsa:2048 \
    -keyout localhost.key -out localhost.crt \
    -days 3650 \
    -subj "/CN=localhost" \
    -reqexts SAN -extensions SAN \
    -config <(cat /etc/ssl/openssl.cnf <(printf "\n[SAN]\nsubjectAltName=IP:127.0.0.1,DNS:localhost"))
    
    dns_digitalocean_token = 0000111122223333444455556666777788889999aaaabbbbccccddddeeeeffff
    
    root@prod-host:~# /usr/bin/openssl x509 -enddate -noout -in path-to-certificate-pem-file
    notAfter=May 25 19:24:12 2019 GMT
    
    [ req ]
    default_bits = 2048
    
    prompt = no
    distinguished_name=req_distinguished_name
    req_extensions = v3_req
    
    [ req_distinguished_name ]
    countryName=UA
    stateOrProvinceName=root region
    localityName=root city
    organizationName=Market(localhost)
    organizationalUnitName=roote department
    commonName=market.localhost
    emailAddress=root_email@root.localhost
    
    [ alternate_names ]
    DNS.1        = market.localhost
    DNS.2        = www.market.localhost
    DNS.3        = mail.market.localhost
    DNS.4        = ftp.market.localhost
    DNS.5        = *.market.localhost
    
    [ v3_req ]
    keyUsage=digitalSignature
    basicConstraints=CA:true
    subjectKeyIdentifier = hash
    subjectAltName = @alternate_names
    
    [ req ]
    default_bits = 2048
    
    prompt = no
    distinguished_name=req_distinguished_name
    req_extensions = v3_req
    
    [ req_distinguished_name ]
    countryName=UA
    stateOrProvinceName=Kyiv region
    localityName=Kyiv
    organizationName=market place
    organizationalUnitName=market place department
    commonName=market.localhost
    emailAddress=email@market.localhost
    
    [ alternate_names ]
    DNS.1        = market.localhost
    DNS.2        = www.market.localhost
    DNS.3        = mail.market.localhost
    DNS.4        = ftp.market.localhost
    DNS.5        = *.market.localhost
    
    [ v3_req ]
    keyUsage=digitalSignature
    basicConstraints=CA:false
    subjectAltName = @alternate_names
    subjectKeyIdentifier = hash
    
    openssl genrsa -out ca.key 2048
    openssl req -new -x509 -key ca.key -out ca.crt -days 365 -config config_ssl_ca.cnf
    
    openssl genrsa -out market.key 2048
    openssl req -new -sha256 -key market.key -config config_ssl.cnf -out market.csr
    
    echo 00 > ca.srl
    touch index.txt
    
    # we use 'ca' as the default section because we're usign the ca command
    [ ca ]
    default_ca = my_ca
    
    [ my_ca ]
    #  a text file containing the next serial number to use in hex. Mandatory.
    #  This file must be present and contain a valid serial number.
    serial = ./ca.srl
    
    # the text database file to use. Mandatory. This file must be present though
    # initially it will be empty.
    database = ./index.txt
    
    # specifies the directory where new certificates will be placed. Mandatory.
    new_certs_dir = ./
    
    # the file containing the CA certificate. Mandatory
    certificate = ./ca.crt
    
    # the file contaning the CA private key. Mandatory
    private_key = ./ca.key
    
    # the message digest algorithm. Remember to not use MD5
    default_md = sha256
    
    # for how many days will the signed certificate be valid
    default_days = 365
    
    # a section with a set of variables corresponding to DN fields
    policy = my_policy
    
    # MOST IMPORTANT PART OF THIS CONFIG
    copy_extensions = copy
    
    [ my_policy ]
    # if the value is "match" then the field value must match the same field in the
    # CA certificate. If the value is "supplied" then it must be present.
    # Optional means it may be present. Any fields not mentioned are silently
    # deleted.
    countryName = match
    stateOrProvinceName = supplied
    organizationName = supplied
    commonName = market.localhost
    organizationalUnitName = optional
    commonName = supplied
    
    openssl ca -config config_ca.cnf -out market.crt -in market.csr
    
    openssl rsa -in market.key -check
    
    openssl x509 -in market.crt -text -noout
    
    openssl req -in market.csr -noout -text 
    
    openssl req -x509 -newkey rsa:4096 \
    -keyout my.key -passout pass:123456 -out my.crt \
    -days 365 \
    -subj /CN=localhost/O=home/C=US/emailAddress=me@mail.internal \
    -addext "subjectAltName = DNS:localhost,DNS:web.internal,email:me@mail.internal" \
    -addext keyUsage=digitalSignature -addext extendedKeyUsage=serverAuth
    
    openssl genrsa -out my.key -passout pass:123456 2048
    
    openssl req -x509 \
    -key my.key -passin pass:123456 -out my.csr \
    -days 3650 \
    -subj /CN=localhost/O=home/C=US/emailAddress=me@mail.internal \
    -addext "subjectAltName = DNS:localhost,DNS:web.internal,email:me@mail.internal" \
    -addext keyUsage=digitalSignature -addext extendedKeyUsage=serverAuth
    
    openssl x509 -text -noout -in my.crt
    
    keytool -genkeypair -keystore my.p12 -alias master \
    -storetype pkcs12 -keyalg RSA -keysize 2048 -validity 3650 \
    -storepass 123456 \
    -dname "CN=localhost,O=home,C=US" \
    -ext 'san=dns:localhost,dns:web.internal,email:me@mail.internal'
    
    keytool -exportcert -keystore my.p12 -file my.crt \
    -alias master -rfc -storepass 123456
    
    keytool -printcert -file my.crt
    
    openssl req -x509 -nodes -subj '/CN=localhost'  -newkey rsa:4096 -keyout ./sslcert/key.pem -out ./sslcert/cert.pem -days 365
    
    var fs = require('fs');
    var path = require('path');
    var http = require('http');
    var https = require('https');
    var compression = require('compression');
    var express = require('express');
    var app = express();
    
    app.use(compression());
    app.use(express.static(__dirname + '/www'));    
    
    app.get('/*', function(req,res) {
      res.sendFile(path.join(__dirname+'/www/index.html'));
    });
    
    // your express configuration here
    
    var httpServer = http.createServer(app);
    var credentials = {
        key: fs.readFileSync('./sslcert/key.pem', 'utf8'),
        cert: fs.readFileSync('./sslcert/cert.pem', 'utf8')
    };
    var httpsServer = https.createServer(credentials, app);
    
    httpServer.listen(8080);
    httpsServer.listen(8443);
    
    console.log(`RUNNING ON  http://127.0.0.1:8080`);
    console.log(`RUNNING ON  http://127.0.0.1:8443`);