[開發環境] 建立本地端 SSL 自簽憑證 (Self-Signed Certificate)

因為要開發 facebook oauth 登入,但 facebook 登入目前已經不支援 http 站台的串接,不過有找到更好的方式【ngrok 外部網路連開發環境神器】,本篇文章僅留存紀錄(產生本地端開發用憑證)

方法一、直接建立自簽憑證

  1. 安裝 OpenSSL:若已經安裝 Git,本身有內建 openssl,只需要把 C:\Program Files\Git\usr\bin 設定到環境變數即可。
  2. 建立 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
  3. 產生 PEM 格式的私密金鑰和憑證:以下是產生沒有密碼保護的私密金鑰 server.key 憑證(包括公鑰和一些識別資訊)server.crt 的指令。請注意,在執行指令後,系統會要求你輸入憑證的相關資訊(如下圖所示),按照自己的資料輸入即可,但如果你已完成步驟二並指定了配置檔 ssl.conf 的路徑,則不需要手動再次輸入資料。
  4. 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:(非必要) 憑證識別資訊的檔案路徑

  5. 產生 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 檔案的密碼。

  6. 安裝 Server.crt 憑證到所有需要信任此憑證的客戶端,可透過底下的指令,或者直接點及憑證進行安裝(安裝憑證→本機電腦→將所有的憑證放入以下的存放區→受信任的根憑證授權單位)。
  7. certutil -addstore -f "ROOT" server.crt





方法二、建立自建 CA 並簽署自簽憑證

在內部系統中,建立自建 CA 並簽署自簽憑證是一種常見的做法,這種方法允許你產生一個自簽的 CA 憑證,然後透過此 CA 簽發內部各服務的憑證, 與直接為每個服務簽發自簽憑證不同,使用自建 CA 憑證只需在每個客戶端安裝一次,以後,如果有新的服務(站台)需要簽發憑證,這些憑證都會被內部系統自動認可,而不需要再次安裝根憑證。

以下是使用自建 CA 的基本步驟

  1. 產生 CA(Certificate Authority)私鑰。
    openssl genrsa -out ca.key 4096
    # genrsa:生成 RSA 私鑰。
    # -out:生成的私鑰將被儲存的路徑。
    # 4096:密鑰的位數(即密鑰的長度)。
    
  2. 建立 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
    
  3. 使用 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)。
    
  4. 產⽣ Server 私密⾦鑰(PEM 格式),無密碼保護。
    openssl genrsa -out server.key 2048
    # genrsa:用來生成 RSA 私鑰。
    # -out:生成的私鑰將被儲存的路徑。
    # 2048:生成的私鑰的位數(即私鑰的長度)。
    
  5. 建立 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 
    
  6. 產⽣ 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)。
    
  7. 使用 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),這些擴展將被添加到生成的證書中。
    
  8. 安裝 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"
/>


參考網站

留言