前言
近來的趨勢很多都開始要求一定要用SSL憑證,即使是在完全不對外的網路環境中,使用者只有組織內部員工的情況下,也是一直被要求要使用SSL憑證(但用憑證又不給CA就是另外一段故事了...)。
因此就來複習一下如何使用OpenSSL來建立自簽憑證吧。
環境
身為一個無腦只會靠UI操作的半路出家工程師,只會用Windows合情合理,所以執行的環境是Windows Server 2022 Standard (21H2),但openssl的操作應該是蠻通用的。
建立憑證
這裡會使用到openssl的
req
指令
openssl-req
建立CA憑證
首先先建立要用來派發憑證的CA,如果有現成的憑證中心,當然是產出請求檔之後,剩下交給憑證中心去解決即可,但這裡使用自己建立。
指令大概如下:
openssl req -x509 -new {演算法} -days {時間天數} -out {憑證檔案名稱:rootCA.crt} -newkey
{⾦鑰演算法:⻑度} -keyout {Key檔案名稱:rootCA.key}
2023-09-22:
-newkey僅能使用rsa演算法,如果需要其它演算法來建立key,則需要使用其它指令
為求方便又不想一直頻繁更換憑證,一次就來簽個100年吧!
範例:
openssl req -x509 -new -sha256 -days 36500 -out rootCA.crt -newkey rsa:4096 -keyout rootCA.key
執行之後,首先會先問key的密碼並再次確認,再來就是輸入一些基本資訊。
完成之後會得到一個憑證檔案與一個key檔案。
建立CSR請求檔
再來是準備提出憑證請求的CSR檔案,如果是有憑證中心的人,執行這一部份就可以產出想要的請求內容了(但要記得補上後續extension的內容,提供審核檢視)。
指令大概如下:
openssl req -new -sha256 -days {時間天數} -out {請求檔案名稱:host.csr} -newkey {⾦鑰演算法:
⻑度} -keyout {Key檔案名稱:host.key} -config {Config檔案:host.cnf}
和產CA的時候一樣,開請求的人手上會有私鑰,所以同樣要輸入一組key的密碼並確認。
範例:
openssl req -new -sha256 -days 36500 -out host.csr -newkey rsa:4096 -keyout host.key -config host.cnf
Config的內容都可呈現在指令中,但也可以透過額外的檔案來載入。
檔案的格式如下:
[ req ]
distinguished_name = req_dn
prompt = no
[ req_dn ]
C = TW
ST = Taiwan
L = Taipei
O = DEMO
OU = IT
CN = demo.com
emailAddress = nobody@demo.com
輸入完之後,就會拿到用於請求的CSR檔案,如果是一般要申請外部憑證中心發憑證時,拿檔案內容提交給憑證中心即可。
使用CA簽發CSR檔案
產出CSR之後,再來是拿出先前產出的CA憑證,並且使用這張憑證來簽發這張CSR想要的憑證內容。
指令大概如下:
openssl x509 -req -in {請求檔案:host.csr} -CA {CA憑證檔案:rootCA.crt} -CAkey {CAKey:rootCA.key} -CAcreateserial -out {產出憑證檔案:host.crt} -days {時間天數} -sha256 -
extfile {x509擴充設定檔案:host.ext}
還有要把一些細項擴充的內容檔案格式如下:
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage=clientAuth,serverAuth
subjectAltName = @alt_names
[alt_names]
DNS.1 = demo.com
IP.1 = 127.0.0.1
範例:
openssl x509 -req -in host.csr -CA rootCA.crt -CAkey rootCA.key -CAcreateserial -out host.crt -days 36500 -sha256 -extfile host.ext
接著就會取得實際上可用的憑證檔案。
轉換憑證格式為pfx檔案
慣用微軟產品的工程師都知道微軟的網頁伺服器SSL憑證只能使用PFX格式,所以就順手做一下合成key檔案,做出PFX憑證。
拿出前幾步驟所產出的檔案就可以開始了!
指令大概如下:
openssl pkcs12 -export -out {輸出pfx檔案} -inkey {憑證key檔案} -in {憑證crt檔案} -certfile
{根憑證crt檔案} -name {易記名稱}
範例:
openssl pkcs12 -export -out host.pfx -inkey host.key -in "host.crt" -certfile "rootCA.crt" -name "My Demo Cert"
輸入完之後就是驗證憑證key的密碼以及後續輸出要使用的密碼,就會產出PFX檔案囉!
驗證
眼尖的就會看到上面的範例把憑證做成SAN Certificate,不過另外一個是用本機IP(127.0.0.1),所以就把憑證直接掛在Windows Server IIS上的預設站台來看一下,顯示憑證沒有問題,是有效的。
參考
本篇文章是透過在Windows上安裝OpenSSL來操作,平常比較多是使用cmder with Git for Windows,因為git中就有openssl,再加上cmder方便的CMD視窗,也不用考慮相依軟體的問題,想在離線環境無腦操作的情況下,用起來整個舒服很多。
OpenSSL常見於Linux,在Windows上安裝網路上也有豐富的資源與教學(例如:如何在Window上安裝 OpenSSL?),連youtube都有相關影片,就不再多提如何來安裝了。