本文主要記述在Linux系統上使用Openssl建立SSL證書的流程,作為個人學習筆記。自簽名證書分為自簽名私有證書和自簽名CA憑證兩種。自簽名私有證書無法被吊銷,自簽名CA憑證可以被吊銷。
什麼是openssl
OpenSSL為網絡通信提供安全及資料完整性的一種安全協定,囊括了主要的密碼算法、常用的密鑰和證書封裝管理功能以及SSL協定,并提供了豐富的應用程式供測試或其它目的使用;openssl隻是OpenSSL開源套件中的多功能指令工具;
OpenSSL套件的組成部分有:
1.libcrypto:通用功能的加密庫;
2.libssl:用于實作TSL/SSL功能的庫;
3. openssl:多功能指令工具。
生成自簽名私有證書
1. 生成證書私鑰(Key)
openssl genrsa -out /path/keyfile 2048
如果想對已生成的私鑰加密:(以下指令是使用DES3加密)
openssl rsa -in /path/keyfile -des3 -out /path/encrypted.key
也可以在生成時直接加密(以下例子使用AES256)
openssl genrsa 加密方式 -out /path/keyfile 2048
2. 生成證書請求檔案(Certificate Sign Request)
openssl req -new -key /path/keyfile -out /path/csrfile
- 在輸入域名時,需要多加注意,填寫的域名必須是你要https方式通路的那個域名。如abc.com 或 web.abc.com, abc.com 和web.abc.com,www.abc.com都是不同的域名。
- 在輸入資訊時,不要出現任何特殊字元,如:(~,%,^,$,@,#,&,!,等)。
3. 自簽名,生成私有證書(Certificate)
openssl x509 -req -in /path/csrfile.csr -signkey /path/keyfile.key -out /path/ssl.crt
4. 指令合并
從生成私鑰到自簽名,生成私有證書,可以合并成一條指令:
openssl req -new -x509 -newkey rsa:2048 -keyout /path/server.key -out /path/server.crt
5. 檢視證書資訊
openssl x509 -in /path/certfile -noout -text
- 以上例子中,檔案夾為個人随意建立的,有些不妥,沒有參考價值。
生成自簽名CA憑證
建立自簽 CA 證書,主要分為兩個部分: 建立CA 根證書及簽發證書。
- 1. 建立CA根證書
- 可以使用openssl建立CA,用來簽發證書,預設情況ubuntu和CentOS上都已安裝好openssl。CentOS 6.x 上有關ssl證書的目錄結構。
/etc/pki/CA/
newcerts 存放CA簽署(頒發)過的數字證書(證書備份目錄)
private 用于存放CA的私鑰
crl 吊銷的證書
/etc/pki/tls/
cert.pem 軟連結到certs/ca-bundle.crt
certs/ 該伺服器上的證書存放目錄,可以存放自己的證書和内置證書
ca-bundle.crt 内置信任的證書
private 證書密鑰存放目錄
openssl.cnf openssl的CA主配置檔案
可以在配置檔案中配置預設值,這樣就不用每次重新輸入了。非必須操作。以下是配置檔案可修改參數,都是原狀态,本人沒有修改。
default_md = default # use public key default MD
default_md = sha1
countryName_default = XX
stateOrProvinceName_default = Default Province
localityName_default = Default City
0.organizationName_default = Default Company Ltd
- 生成根證書密鑰(與上面基本相同)
openssl genrsa -aes256 -out /etc/pki/CA/private/cakey.pem 2048
- 生成根證書請求(與上面基本相同)
openssl req -new -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.csr
- 生成根證書
openssl x509 -days 3650 -in /etc/pki/CA/cacert.csr -req -signkey /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem
2. 生成序列号和索引檔案
準備好序列号和索引檔案,不然以下操作會出錯,也可以在建立根證書前準備好
touch /etc/pki/CA/index.txt
echo 00 > /etc/pki/CA/serial
3. 建立需要認證的伺服器證書
除路徑外其他操作同上
openssl genrsa -aes256 -out /etc/pki/tls/private/privkey.pem 2048
openssl req -new -key /etc/pki/tls/private/privkey.pem -out /etc/pki/tls/certs/domain_name.csr
4. 簽發證書
openssl ca -in domain_name.csr -out /etc/pki/tls/certs/domain_name.crt.pem -days 825
#如果不用系統自帶目錄結構,簽發證書的指令如下
openssl x509 -req -days 365 -in /path/csrfile.csr -CA /path/ca.crt -CAkey /path/ca.key -set_serial 01 -out /path/csrfile.crt
在Nginx中使用證書
Nginx配置檔案如下設定
# HTTPS server
server {
listen 443 ssl http2 default_server;
server_name e-highwayapp.com;
ssl_certificate "/home/ds/nginx/server_certificates/ssl.globalsign.com.crt";
ssl_certificate_key "/home/ds/nginx/server_certificates/private.key";
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 10m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:SEED:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!RSAPSK:!aDH:!aECDH:!EDH-DSS-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA:!SRP;
ssl_prefer_server_ciphers on;
location / {
root html;
index index.html index.htm;
}
}
用戶端證書配置
用戶端證書建立與服務端證書建立一緻。
在浏覽器内配置即可
CA憑證的有效性驗證
openssl verify -CAfile /path/ca.crt /path/server.crt
證書格式轉換
轉換為P12證書
openssl pkcs12 -export -in /path/server.crt -inkey /path/server.key -out /path/server.p12
吊銷證書
#擷取要吊銷的證書的serial
openssl x509 -in /path/x.crt -noout -serial -subject
#對比serial與subject 資訊是否與index.txt中的資訊一緻
#如果一緻,則可以吊銷證書
openssl ca -revoke /etc/pki/CA/newcerts/SERIAL.pem
#如果是第一次吊銷證書,需要指定吊銷的證書編号
echo 01 >/etc/pki/CA/crlnumber
#更新吊銷證書清單
openssl ca -gencrl -out /etc/pki/CA/crl.pem
#完成後,可檢視吊銷的證書清單
openssl crl -in /etc/pki/CA/crl.pem -noout -text
學習過程中參考了很多前輩文章:
https://www.jianshu.com/p/81dbcde4fd7c
https://qiita.com/ll_kuma_ll/items/13c962a6a74874af39c6#%E9%8D%B5%E4%BD%9C%E6%88%90
https://qiita.com/tarosaiba/items/2ec41280d72b2e98b3bf
https://qiita.com/tarosaiba/items/9fa3320b633e0f5e87b5#4-%E3%82%AF%E3%83%A9%E3%82%A4%E3%82%A2%E3%83%B3%E3%83%88%E5%81%B4%E3%81%AE%E8%A8%AD%E5%AE%9A