一、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可获取更多参数信息。