使用OpenSSL建立自簽SSL憑證


Posted by 江馬特 on 2023-08-26

前言

近來的趨勢很多都開始要求一定要用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的密碼並再次確認,再來就是輸入一些基本資訊。

使用openssl建立CA

完成之後會得到一個憑證檔案與一個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上的預設站台來看一下,顯示憑證沒有問題,是有效的。

掛上憑證

參考

  1. OpenSSL
  2. Create a self-signed certificate using OpenSSL

本篇文章是透過在Windows上安裝OpenSSL來操作,平常比較多是使用cmder with Git for Windows,因為git中就有openssl,再加上cmder方便的CMD視窗,也不用考慮相依軟體的問題,想在離線環境無腦操作的情況下,用起來整個舒服很多。

OpenSSL常見於Linux,在Windows上安裝網路上也有豐富的資源與教學(例如:如何在Window上安裝 OpenSSL?),連youtube都有相關影片,就不再多提如何來安裝了。


#openssl #自簽憑證 #Self-signed certificate







Related Posts

Day 54 & 55 - Function Decorators

Day 54 & 55 - Function Decorators

Android Status bar 深色模式設定

Android Status bar 深色模式設定

git

git


Comments