[開發環境] 建立本地端 SSL 自簽憑證 (Self-Signed Certificate)
因為要開發 facebook oauth 登入,但 facebook 登入目前已經不支援 http 站台的串接,不過有找到更好的方式【ngrok 外部網路連開發環境神器】,本篇文章僅留存紀錄(產生本地端開發用憑證)。
方法一、直接建立自簽憑證
- 安裝 OpenSSL:若已經安裝 Git,本身有內建 openssl,只需要把 C:\Program Files\Git\usr\bin 設定到環境變數即可。
- 建立 ssl.conf 設定檔:你可以建立一個 ssl.conf 設定檔來配置憑證相關資訊,也可以不使用此設定檔,並在產生憑證時手動輸入所需資訊。
[req] prompt = no default_md = sha256 default_bits = 2048 distinguished_name = dn x509_extensions = v3_req [dn] C = TW ST = Taiwan L = Kaohsiung O = PrimeEagle Studio. OU = IT Department emailAddress = lawrence@primeeagle.net CN = PrimeEagle [v3_req] subjectAltName = @alt_names [alt_names] DNS.1 = *.localhost DNS.2 = localhost DNS.3 = PcName IP.1 = 127.0.0.1 IP.2 = 192.168.0.100
- 產生 PEM 格式的私密金鑰和憑證:以下是產生沒有密碼保護的私密金鑰 server.key 和憑證(包括公鑰和一些識別資訊)server.crt 的指令。請注意,在執行指令後,系統會要求你輸入憑證的相關資訊(如下圖所示),按照自己的資料輸入即可,但如果你已完成步驟二並指定了配置檔 ssl.conf 的路徑,則不需要手動再次輸入資料。
- 產生 IIS 網站所需的 PFX 格式的憑證檔案:將建立好的 私密金鑰(server.key) 與 憑證檔案(server.crt)組合成一個 PFX 憑證檔案,過程會要求輸入密碼來保護這個 server.pfx 檔案,當然你也可以在指令中直接輸入密碼。
openssl pkcs12 -export -in server.crt -inkey server.key -out server.pfx \ -name PrimeEagleSSL -passout pass:123456 # pkcs12 -export:將證書和私密金鑰打包成 PKCS#12 格式(通常用 .pfx 或 .p12 做為副檔名) # -in:指定輸入的證書檔案。 # -inkey:指定輸入的私密金鑰檔案。 # -out:指定輸出的 PKCS#12 檔案名稱。 # -name:這個名稱在一些工具或應用程式中顯示,用來識別這個證書。 # -passout:設定輸出的 PKCS#12 檔案的密碼。
- 安裝 Server.crt 憑證到所有需要信任此憑證的客戶端,可透過底下的指令,或者直接點及憑證進行安裝(安裝憑證→本機電腦→將所有的憑證放入以下的存放區→受信任的根憑證授權單位)。
openssl req -x509 -new -nodes -sha256 -utf8 -days 3650 -newkey rsa:4096 \
-keyout server.key -out server.crt -config ssl.conf
# -x509:生成一個自簽名的 X.509 憑證的請求
# -new:產生新的 CSR 憑證
# -nodes:private key 不加密
# -sha256:憑證使用的雜湊演算法
# -days:憑證效期
# -newkey:私密金鑰使用的加密演算法,後方指定 rsa:bits
# -keyout:輸出 CSR 憑證的 Private Key 的檔案
# -out:輸出 CSR 憑證的檔案
# -config:(非必要) 憑證識別資訊的檔案路徑
certutil -addstore -f "ROOT" server.crt
方法二、建立自建 CA 並簽署自簽憑證
在內部系統中,建立自建 CA 並簽署自簽憑證是一種常見的做法,這種方法允許你產生一個自簽的 CA 憑證,然後透過此 CA 簽發內部各服務的憑證, 與直接為每個服務簽發自簽憑證不同,使用自建 CA 憑證只需在每個客戶端安裝一次,以後,如果有新的服務(站台)需要簽發憑證,這些憑證都會被內部系統自動認可,而不需要再次安裝根憑證。
以下是使用自建 CA 的基本步驟
- 產生 CA(Certificate Authority)私鑰。
openssl genrsa -out ca.key 4096 # genrsa:生成 RSA 私鑰。 # -out:生成的私鑰將被儲存的路徑。 # 4096:密鑰的位數(即密鑰的長度)。
- 建立 ca.conf 設定檔。
[req] prompt = no distinguished_name = dn [dn] C = TW ST = Taiwan L = Kaohsiung O = PrimeEagle Studio. OU = IT Department emailAddress = lawrence@primeeagle.net CN = PrimeEagle
- 使用 CA 私鑰產⽣⼀份⾃我簽署的 CA 憑證。
openssl req -new -x509 -days 36500 -sha256 -utf8 -config ca.conf -key ca.key -out ca.crt # req:生成證書請求(Certificate Signing Request, CSR)。 # -new:生成一個新的證書請求或證書。 # -x509:生成自簽名證書,而不是常規的 CSR。 # -days 36500:證書的有效期為 36500 天(約 100 年)。 # -sha256:使用 SHA-256 算法來生成證書的簽名。 # -utf8:輸出使用 UTF-8 編碼。 # -config ca.conf:指定一個配置文件(ca.conf)來定義證書的詳細資訊。 # -key:用於簽名證書的私鑰(ca.key)。 # -out:生成的自簽名證書將被儲存的路徑(ca.crt)。
- 產⽣ Server 私密⾦鑰(PEM 格式),無密碼保護。
openssl genrsa -out server.key 2048 # genrsa:用來生成 RSA 私鑰。 # -out:生成的私鑰將被儲存的路徑。 # 2048:生成的私鑰的位數(即私鑰的長度)。
- 建立 server.conf 設定檔,請注意這邊的 CN 不能跟 CA 的一樣。
[req] prompt = no distinguished_name = dn req_extensions = req_ext [dn] CN = PrimeEalge Server [req_ext] subjectAltName = @alt_names [alt_names] DNS.1 = *.localhost DNS.2 = localhost IP.1 = 127.0.0.1
- 產⽣ Server 的憑證請求檔 CSR(Certificate Signing Request)。
openssl req -new -key server.key -config server.conf -out server.csr # req:生成證書請求(CSR)。 # -new:生成一個新的證書請求。 # -key:生成 CSR 的私鑰(server.key)。 # -config:配置文件(server.conf),用來定義生成 CSR 的詳細信息,如證書主題、擴展等。 # -out:生成的證書簽名請求將被儲存的路徑(server.csr)。
- 使用 CA 簽發各服務的憑證。
openssl x509 -req -CAcreateserial -days 30 -sha256 -CA ca.crt -CAkey ca.key -in server.csr -out server.crt -extfile server.conf -extensions req_ext # x509:操作和管理 X.509 數字證書的命令。 # -req:這指示 OpenSSL 將處理一個 CSR。 # -CAcreateserial:自動創建一個序列號文件用於簽署的證書。 # -days 30:簽署的證書的有效期為 30 天。 # -sha256:使用 SHA-256 算法來生成證書的簽名。 # -CA:用來簽署(簽發)證書的 CA 憑證文件(ca.crt)。 # -CAkey:用來簽署(簽發)證書的 CA 私鑰(ca.key)。 # -in:待簽署的 CSR 文件(server.csr)。 # -out:生成的 X.509 數字證書將被儲存的路徑(server.crt)。 # -extfile:配置文件(server.conf),用來定義證書的擴展信息,如主題、使用者擴展等。 # -extensions:要應用的擴展配置名稱(req_ext),這些擴展將被添加到生成的證書中。
- 安裝 CA 憑證到所有需要信任此 CA 的客戶端,同方法一的安裝步驟。
Tomcat 6.x 使用自簽憑證
完成根憑證的安裝後,請打開 Server.xml 並輸入底下設定,請注意如果在 Tomcat 6.x 版本上,直接使用 IIS 用的 PFX 檔案,在 Chrome 上面會出現 ERR_SSL_VERSION_OR_CIPHER_MISMATCH 的錯誤訊息(Tomcat 8 則無此問題)。
<Connector
URIEncoding="UTF-8"
protocol="HTTP/1.1"
port="443"
maxThreads="200"
maxPostSize="0"
scheme="https"
secure="true"
SSLEnabled="true"
SSLCertificateFile="D:\apache-tomcat-6.0.39\SSL\server.crt"
SSLCertificateKeyFile="D:\apache-tomcat-6.0.39\SSL\server.key"
sslEnabledProtocols="TLSv1,TLSv1.1,TLSv1.2"
ciphers="TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384, TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_RSA_WITH_RC4_128_SHA, TLS_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA256, TLS_RSA_WITH_AES_256_CBC_SHA,SSL_RSA_WITH_RC4_128_SHA"
/>
留言
張貼留言
您好,我是 Lawrence,這裡是我的開發筆記的網誌,如果你對我的文章有任何疑問或者有錯誤的話,歡迎留言讓我知道。