一、OpenSSL簡介
OpenSSL支持多種秘鑰算法,包括RSA、DSA、ECDSA,RSA使用比較普遍。官網地址:https://www.openssl.org/,一般CeontOS系統都裝有OpenSSL,可使用命令openssl verson查看
openssl verson
二、秘鑰操作
A)生成RSA私鑰。-out private.key 輸出秘鑰文件為private.key;128 為秘鑰大小,目前認為2048大小是比較安全的,本文測試使用128大小。
openssl genrsa -out private.key 128
生成的私鑰樣例為:
-----BEGIN RSA PRIVATE KEY-----
MGMCAQACEQDS52MK0Nw1QIfRfSaTOhdnAgMBAAECEQCV/r6v6I9Uxv/J3tc5onvB
AgkA6o1Gly9yqVECCQDmMIZkMe6HNwIIaKE68yhMWvECCBXOAuz6zd2BAgkAlR9Y
VQCWm2A=
-----END RSA PRIVATE KEY-----
B)生成帶密碼的RSA私鑰。-aes256:指定私鑰密碼加密方式;-passout pass:1234:設置私鑰密碼為1234
openssl genrsa -aes256 -passout pass:1234 -out private.key 128
生成的私鑰樣例如下:
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-256-CBC,B15639107691B98267AD45CF619539BB
Xf7uNMPFE3pdc0T5hmrZWaU5GmK/Jaf7B8oF4pmeTWAJ7SvGvQKxeFBecE1ROn6z
xIuSkHI9SwsdTlwNJmvYzGLwLwHNwXGc/cJF0EISlsBYTE/v2C12tj9E5VGKiTeH
DRuIEhyaypqMp5+Ceyi61A==
-----END RSA PRIVATE KEY-----
C)私鑰加密:
openssl rsa -in private.key -aes256 -passout pass:1234 -out private_pwd.pem
私鑰去除加密:
openssl rsa -in private_pwd.key -passin pass:1234 -out private.key
D)生成公鑰, 如果私鑰private.pem有密碼,生成公鑰時會提示需要輸入密碼。
openssl rsa -in private.key -pubout -out public.key
公鑰樣例如下:
-----BEGIN PUBLIC KEY-----
MCwwDQYJKoZIhvcNAQEBBQADGwAwGAIRANGuQHQ1P4GTgcQwHdS4nIcCAwEAAQ==
-----END PUBLIC KEY-----
三、生成自簽名證書
A)使用已有的私鑰創建自簽名根證書(x509證書包含公鑰、身份信息、簽名信息)
openssl genrsa -out root.key 2048 // 生成私鑰
openssl req -new -x509 -days 3650 -key root.key -out root.crt -subj "/C=CN/ST=hubei/L=wuhan/O=zhi/OU=zhi/CN=root" // 直接生成簽名證書
#下面2個命令等效上面這個命令
openssl req -new -key root.key -out root.csr -subj "/C=CN/ST=hubei/L=wuhan/O=zhi/OU=zhi/CN=root" // 生成簽名申請
openssl x509 -req -days 3650 -in root.csr -signkey root.key -out root.crt // 生成簽名證書
-subj擁有者信息,CN:姓名;OU:組織單位名稱;O:組織名稱;L:省/市/自治區名稱;C:國家/地區代碼
生成證書的效果:
B)使用根證書簽名其他證書。
openssl genrsa -out second.key 2048 // 生成私鑰
openssl req -new -key second.key -out second.csr -subj "/C=CN/ST=hubei/L=SZ/O=test/OU=test/CN=second" // 生成簽名請求
openssl ca -in second.csr -days 3650 -out second.crt -cert root.crt -keyfile root.key // 使用root證書進行簽名
生成的證書樣式效果:
我們也可以使用二級證書簽名其他證書:
openssl genrsa -out tomcat.key 2048 // 生成私鑰
openssl req -new -key tomcat.key -out tomcat.csr -subj "/C=CN/ST=hubei/L=SZ/O=test/OU=test/CN=tomcat" // 生成簽名請求
openssl ca -in tomcat.csr -days 3650 -out tomcat.crt -cert second.crt -keyfile second.key // 使用second證書進行簽名
簽名過程中出現的問題:
1、找到不index.txt文件
/etc/pki/CA/index.txt: No such file or directory
unable to open '/etc/pki/CA/index.txt'
139798482433936:error:02001002:system library:fopen:No such file or directory:bss_file.c:402:fopen('/etc/pki/CA/index.txt','r')
139798482433936:error:20074002:BIO routines:FILE_CTRL:system lib:bss_file.c:404:
解決方式,在/etc/pki/CA目錄創建詳細的文件:
cd /etc/pki/CA
touch index.txt
touch serial
echo "01" > serial
2、The organizationName field needed to be the same in the CA certificate (zhi) and the request (test),修改/etc/pki/tls/openssl.cnf,將organizationName的值有match改為optional。
四、證書轉換
openssl x509 -in root.crt -out root.pem // crt轉pem格式
openssl x509 -in mycert.crt -out mycert.pem -outform pe // crt轉pem格式
openssl x509 -in root.crt -out root.cer -outform der // crt轉cer格式
openssl pkcs12 -export -in root.crt -inkey root.key -out root.p12 -name root // crt轉p12格式
使用JDK自帶的ketool進行jks和p12格式互轉:
keytool -importkeystore -srckeystore test.p12 -srcstoretype PKCS12 -deststoretype JKS -destkeystore test.jks
keytool -importkeystore -srckeystore test.jks -srcstoretype JKS -deststoretype PKCS12 -destkeystore test.p12
p12證書中提取信息:
openssl pkcs12 -in keystore.p12 -password pass:123456 -passout pass:123456 -nocerts -out private.pem // 提取私鑰(加密私鑰文件)
openssl pkcs12 -in keystore.p12 -password pass:123456 -nodes -nocerts -out private.pem // 提取私鑰(不加密私鑰文件)
openssl pkcs12 -in keystore.p12 -password pass:123456 -nokeys -out out/all_cert.pem // 提取所有證書
openssl pkcs12 -in keystore.p12 -password pass:123456 -nokeys -cacerts -out out/cacert.pem // 僅輸出CA證書
openssl pkcs12 -in keystore.p12 -password pass:123456 -nokeys -clcerts -out out/cert.pem // 僅輸出客戶端證書
使用openssl pkcs12 help可獲取更多參數信息。