配置https and http2 local本地開發環境

今天,幾乎全部你訪問的網站都是受HTTPS保護的。若是你尚未這樣作,是時候這樣作了。使用HTTPS保護您的服務器也就意味着您沒法從非HTTPS的服務器發送請求到此服務器。這對使用本地開發環境的開發人員來講是一個問題,由於這些本地開發環境都是運行在http://localhost下的

在啓動過程當中,咱們決定使用HTTPS來保護咱們的AWS Elastic Load Balancer endpoints,做爲加強安全性的一部分。一開始的時候我遇到了一個問題,個人本地開發環境對服務器的請求被拒絕。
經過快速谷歌搜索後,我發現一些文章也許對我有用,像這個,這個或者這個,它們都有關於localhost如何實現HTTPS的詳細說明。但即便按照這些指示亦步亦趨,最後卻都失敗了。Chrome老是向我拋出一個NET::ERR_CERT_COMMON_NAME_INVALID。html

在着手配置https開發環境以前建議瀏覽這篇文章搞清楚https的工做原理及相關概論node

若是對各類類型的證書類型及其做用不了解能夠參考這篇文章git

問題
這些文章中的全部步驟都是正確的,但那僅限於它們被髮布的時間點,而不是如今。
通過大量的谷歌搜索以後,我發現個人本地證書被拒絕的緣由是,Chrome已經再也不支持證書中的commonName匹配,實際上,自2017年1月起須要subjectAltName這個規則了。web

解決方案chrome

第一步:建立根證書apache

若是對根證書的概念不瞭解能夠參考如下文章瀏覽器

https introduction 和 What is a Root SSL Certificate?tomcat

生成一個RSA-2048密鑰並保存到一個文件rootCA.key。該文件將被用做生成根SSL證書的密鑰。系統將提示您輸入密碼,每次使用此特定密鑰生成證書時都須要輸入該密碼安全

$ openssl genrsa -des3 -out rootCA.key 2048

您可使用您生成的密鑰來建立新的根SSL證書。並將其保存爲companyCA.pem。這個證書將有3,650天的有效期。你能夠隨意將其更改成任何您想要的天數。在這一過程當中,你還將被提示輸入其餘可選信息。(模擬頂級CA - Certificaton agent給某公司或orgnization頒發證書)服務器

openssl req -x509 -new -nodes -key rootCA.key -sha256 -days 3650 -out companyCA.pem

第2步:如何把根SSL證書導入到Windows根證書存儲區

打開控制面板 -》 系統與安全

輸入關鍵字cer搜索,選擇管理用戶證書或者管理計算機證書

 

 打開受信任的根證書

從菜單導入

 

 

 查看導入結果

 

第3步:建立域SSL證書(模擬公司拿到root CA 頒發的證書後,給公司主域名下的子域名生成證書,這裏假設localhost公司子域名之一)

固然也能夠經過修改本地host文件或公司DNS服務器配置模擬出一個子域名 如dev.xxxx.com。

根SSL證書(companyCA.pem)如今能夠用來爲您的本地localhost開發環境專門發行證書。

建立一個新的OpenSSL配置文件server.csr.cnf以便在建立證書時能夠導入這些設置,而沒必要在命令行上輸入它們。

修改 DNS.1爲本身的域名

[ req ]

default_bits        = 2048 default_keyfile = companyCA.pem distinguished_name = subject req_extensions = req_ext x509_extensions = x509_ext string_mask = utf8only [ 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 commonName = Common Name (e.g. server FQDN or YOUR name) commonName_default = Example Company emailAddress = Email Address emailAddress_default = test@example.com [ x509_ext ] subjectKeyIdentifier = hash authorityKeyIdentifier = keyid,issuer basicConstraints = CA:FALSE keyUsage = digitalSignature, keyEncipherment subjectAltName = @alternate_names nsComment = "OpenSSL Generated Certificate" [ req_ext ] subjectKeyIdentifier = hash basicConstraints = CA:FALSE keyUsage = digitalSignature, keyEncipherment subjectAltName = @alternate_names nsComment = "OpenSSL Generated Certificate" [ alternate_names ] DNS.1 = localhost

建立證書密鑰以localhost使用存儲在其中的配置設置server.csr.cnf。該密鑰存儲在server.key。

openssl req -new -sha256 -nodes -out server.csr -newkey rsa:2048 -keyout server.key -config server.csr.cnf

證書籤名請求經過咱們以前建立的根SSL證書頒發,建立出一個localhost的域名證書。輸出是一個名爲的證書文件server.crt。

 

openssl x509 -req -in server.csr -CA companyCA.pem -CAkey rootCA.key -CAcreateserial \
-out server.crt -days 500 -sha256 -extensions x509_ext -extfile server.csr.cnf

 

建立keystore和密鑰對

此時系統會要求設置keystore密碼,設置密碼,例如changeit, 並記住它後面配置gretty會用到此密碼

keytool -genkey -alias mydomain -keyalg RSA -keystore keystore.jks -keysize 2048 -ext san=dns:your_domain

導入根證書或中級證書到keystore

keytool -import -trustcacerts -alias root -file server.crt -keystore keystore.jks

列出keystore存在的全部證書

keytool -list -v -keystore keystore.jks

配置gretty屬性

gretty {
  servletContainer = "tomcat9"
  serverConfigFile = "tomcat.xml"
  integrationTestTask = 'test'
}

 put tomcat.xml under %project_home%/tomcat/tomcat.xml with the content below

<Server port="8005" shutdown="SHUTDOWN">
    <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
    <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
    <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
    <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />

    <Service name="Catalina">
        <Connector protocol="HTTP/1.1" port="80" maxHttpHeaderSize="8192" maxThreads="500" minSpareThreads="25" maxSpareThreads="75"
                   enableLookups="false" redirectPort="443" acceptCount="100"
                   connectionTimeout="20000" disableUploadTimeout="true" >
            <UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" />
        </Connector>
      
       <!--<Connector
                protocol="org.apache.coyote.http11.Http11AprProtocol"
                port="443" maxThreads="200"
                scheme="https" secure="true" SSLEnabled="true"
                keystoreFile="c:\Users\user_name\ssl\keystore.p12" keystorePass="changeit"
                clientAuth="false" sslProtocol="TLS">
            <UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" />
        </Connector>-->
        <Connector port="443" protocol="org.apache.coyote.http11.Http11AprProtocol" maxThreads="150" SSLEnabled="true">
            <UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol"/>
            <SSLHostConfig honorCipherOrder="false">
                <Certificate certificateKeyFile="c:\Users\user_name\ssl\server.key"
                             certificateFile="c:\Users\user_name\ssl\server.crt"/>
            </SSLHostConfig>
        </Connector>

        <Connector port="8009" enableLookups="false" redirectPort="443" protocol="AJP/1.3" />
        <Engine name="Catalina" defaultHost="localhost">
            <Host name="localhost"  appBase="webapps" unpackWARs="true" autoDeploy="true">
            </Host>
        </Engine>
    </Service>
</Server>

 

For the protocal Http11AprProtocol need download Apr native dll(tcnative-1.dll) and put it under JDK/bin and restart machine

refer to here for detailed instructions 

cd project_home

gradle appRun

重啓Chrome(很重要)

打開網站

看到瀏覽器上的小鎖,即成功

 

 

 

參考文獻

https://deliciousbrains.com/https-locally-without-browser-privacy-errors/

https://www.cnblogs.com/chyingp/p/https-introduction.html

推薦如下文章

https://superuser.com/questions/1083766/how-do-i-deal-with-neterr-cert-authority-invalid-in-chrome

https://www.chinassl.net/ssltools/keytool-commands.html

https://juejin.im/post/5a6db896518825732d7fd8e0

https over nio: https://www.cnblogs.com/librena/p/6707646.html

相關文章
相關標籤/搜索