Create a self-signed certificate using OpenSSL
TL;DR: 請去用 Let’s Encrypt :P
上禮拜回去帶高中社團寒訓的時候讓大家試著架了一下各種伺服器,像是 Web Server (FAMP) 、Mail Server (Postfix + Dovecot) 之類的。當然其中一個部分就是要追隨潮流(咦)幫每個東西加個 S :讓 HTTP 變成 HTTPS,IMAP 變成 IMAPS 之類的。
當然現在遇到這種情況我個人都覺得就用 Certbot 直接弄個 Let’s Encrypt 的 certificate 就好了,不過確實偶爾也是會有想要用自簽憑證 (Self-signed Certificate) 測試一下就好的情況,所以就來把這個步驟記一下,因為我那天看了才發現這個步驟好像對大家來說意外的是個難關(?)
以下名詞預設大家已經理解:
- certificate:指 SSL 證書
- key:指證書的私鑰
- CA:Certificate Authority,憑證頒發機構,負責簽憑證的
- CSR:Certificate Signing Request
Method #1: 直接生出一組 key & certificate
openssl req -x509 -newkey rsa:4096 -sha256 -nodes -keyout key.pem -out cert.pem -days 30
對,就是這麼簡單,一行 :D
其中的參數說明一下:
req
:Certificate Request(PKCS #10)x509
:輸出 x509 的 certificate ,而不要輸出 certificate requestnewkey rsa:4096
:建立一個新的 4096 bits 的 RSA keysha256
:用 SHA256 做檢查碼(Digest)nodes
:不要幫 key 加密keyout
:輸出 key 的檔案out
:輸出 certificate 的檔案days 365
:憑證的有效日期
這樣你就會有一個叫做 key.pem
的私鑰檔跟 cert.pem
的證書檔可以直接用在各種服務上了。順帶提一下之所以不幫 key 加密的原因是因為服務基本上都需要讀到 key 跟 certificate 兩個檔,你如果加密了不是把密碼寫在檔案裡就是每次重啟服務的時候都要輸入一次,這邊為了方便就算了。
Method #2: 用自己的 CA 簽自己的 Certificate
用這個方法的話步驟會稍微多一點點,大致上是這樣:
- 先幫自己的 CA 生一組 key & certificate
- 幫自己的主機生一組 key & CSR
- 用自己的主機簽 CSR 讓他變成 certificate
首先我們先幫 CA 生一組 key
openssl genrsa -des3 -out ca.key 4096
由於 CA 的 key 只有在簽 certificate 的時候會用到,不像 certificate 的 key 服務本身會用到,所以這邊可以加上 des3
,會要你輸入一個密碼加密。
openssl req -x509 -new -nodes -key ca.key -sha256 -days 365 -out ca.crt
接下來我們幫 CA 生一組 certificate,通常這個天數會久不少。
openssl genrsa -out host.key 4096
這組是主機上的服務要用的 key ,就不加密了。
openssl req -new -key host.key -sha256 -out host.csr
產生一個 CSR ,會要求你輸入一些資訊,你也可以把他們弄成參數直接帶入,像下面這樣:
openssl req -new -key host.key -subj "/C=TW/ST=Taiwan/L=Taipei City/O=MyOrg/OU=MyUnit/CN=my.domain" -sha256 -out host.csr
最後來簽這個 CSR 產生 certificate
openssl x509 -req -in host.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out host.crt -days 30 -sha256
其中幾個先前沒出現的參數說明一下:
in
:輸入檔案,這邊是 CSR 檔out
:輸出檔案,這邊是產生的 certificateCA
:CA 自己的 certificateCAkey
:CA 自己的 keyCAcreateserial
:建立一個 CA 的序號檔(.srl),這是用來記錄 CA 簽了多少 certificate 的,只有第一次需要,之後是直接用CAserial
指定 srl 檔就可以了
第二種方法的好處是你可以簽很多 certificate 出來,把自己的 CA 加入信任的 CA 之後就不會有錯誤訊息了。不過說真的,Certbot 跟 Let’s Encrypt 真的很方便,不試試嗎? :P