關於 web service, unity, blogger 等軟體工程筆記

如何建立 OpenSSL Self-Sign Certificate

Edit icon 沒有留言
HTTPS

要建立一個自己測試用的 SSL 伺服器,需要產生憑證(Certificate)。沒預算支付由信任憑證單位(CA: Certificate Authority)所簽署的憑證費用。因此自己用 OpenSSL 建立 CA,然後自己簽署自己的憑證。雖然是紅色鎖頭會產生警告訊息,反正自己用嘛,自己信任自己就好了。以下是記錄之前建立的步驟。

Chrome bad SSL warning

Self-Sign Certificate

# Step1 產生一組沒有加密的 2048 bits 私密金鑰(PK: Private Key)
openssl genrsa -out server.key 2048
# Step2 產生憑證簽署請求(CSR: Certificate Signing Request)
# /C=Country 國別
# /ST=State 州
# /L=Location 地區
# /O=Organization 組織
# /OU=Organizational Unit 組織部門單位
# /CN=Common Name 網域名稱
openssl req -sha512 -new -key server.key -out server.csr -subj "/C=TW/ST=Taipei/L=Taipei/O=example/OU=Personal/CN=www.example.com"
提示:如果發生錯誤 Unable to load config info from /usr/local/ssl/openssl.cnf,可參考此篇的解決方式
# Step3 檢查 CSR,列出請求內部資料(可省略)
openssl req -in server.csr -noout -text

正常來說,是拿這份 CSR 付錢給信任的 CA 簽署。

# Step4 建立自我簽署的憑證(Self-Sign Certificate)
openssl x509 -sha512 -req -days 3650 -in server.csr -signkey server.key -out server.crt

把 server.key 跟 server.crt 拿去給 Web Server 設定就可以使用 SSL 傳輸了。請注意這裡沒有考量 server.key 沒有加密,有可能被盜用的安全性問題,理論上應該把 server.key 加密拿去給 Web Server 使用,然後重開 Web Server 重新輸入一次加密的密碼,解開私密金鑰使用。

# 私密金鑰加密
# -a 表示檔案使用 base64 編碼
# -salt 加鹽,增加安全性
openssl aes-256-cbc -a -salt -in server.key -out server.encrypt.key

Client Certificate

該測試網站僅限定自己可以使用,一種方法是限制 IP,但手機 IP 會一直更動而無法採用。另外一種就是使用憑證驗證,僅持有該憑證才能進入。因此還需要建立客戶端的憑證。以下拿剛剛所建立的 server.key 來簽署用戶端的憑證。

# Step1 建立用戶端私密金鑰以及簽署請求
openssl genrsa -out client.key 2048
openssl req -sha512 -new -key client.key -out client.csr -subj "/C=TW/ST=Taipei/L=Taipei/O=example/OU=Client/CN=client.example.com"
# Step2 簽署用戶端憑證
openssl x509 -sha512 -req -days 3650 -CA server.crt -CAkey server.key -CAserial server.srl -CAcreateserial -in client.csr -out client.crt
# Step3 驗證簽署
openssl verify -CAfile server.crt client.crt
# Step4 打包加密 PKCS#12 (Public-Key Cryptography Standards),用於部署到用戶端手機以及瀏覽器
openssl pkcs12 -export -out client.p12 -inkey client.key -in client.crt -certfile server.crt

大概是這樣,進一步細節可以參考 OpenSSL 官方網站

沒有留言: