使用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

.Net MVC authorization Controller and Workcontext extension in razor view

.Net MVC authorization Controller and Workcontext extension in razor view

Cookie 是什麼,能吃嗎?

Cookie 是什麼,能吃嗎?

Java 學習筆記 04 – 資料型別轉換

Java 學習筆記 04 – 資料型別轉換


Comments