Openssl命令用法比较多,整理了一下平时常用的命令,做了个流水账,方便以后复杂粘贴。

一、生成公钥和私钥

openssl genrsa -out nixops.me.key 2048
openssl rsa -in nixops.me.key -pubout -out nixops.me.crt

一条命令生成:

openssl  req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout nixops.me.key -out nixops.me.crt

验证私钥和公钥:

openssl rsa -check -in nixops.me.key
openssl x509 -text -noout -in nixops.me.crt  

二、生成私钥和证书请求文件csr

openssl  genrsa -out nixops.me.key 2048
openssl req -new -sha256 -key nixops.me.key -out nixops.me.csr

查看csr 信息:

openssl req -noout -text -in nixops.me.csr

三、自建CA

生成CA私钥:

openssl genrsa -out CAKey.pem 2048

生成CA证书:

openssl req -x509 -sha256 -new -nodes -key CAKey.pem -days 3650 -out CACert.pem

也可以使用不用交互,直接提供相关信息:

openssl req -x509 -sha256 -new -nodes -key CAKey.pem -days 3650 -out CACert.pem  -subj "/C=CN/ST=Guangdong/L=Shenzhen/O=myorganization/OU=nixps LTD/CN=nixops.me"

查看CA证书详细信息:

openssl x509 -in CACert.pem -text

使用CA签发证书:

openssl x509 -req -CA CACert.pem -CAkey CAKey.pem  -CAcreateserial -in nixops.me.csr -out nixops.me.issue.crt -days 365 -sha256

查看签发者信息:

openssl x509  -noout -issuer -issuer_hash -in nixops.me.issue.crt

四、使用openssl加密解密文件

4.1 生成并验证私钥

openssl genrsa -out nixops.me.pem 2048
openssl rsa -in nixops.me.pem -text -noout

4.2 导出公钥并验证

openssl rsa -in nixops.pem -pubout -out pub.pem 
openssl rsa -in pub.pem -pubin -text -noout 

4.3 加解密小文件

使用这种方式1024位的私钥可以加密小于86字节的文件,2048位的私钥可以加密小于214字节的文件。
用公钥加密:

openssl rsautl -encrypt -inkey pub.pem -pubin -in file.txt -out file.bin 

用私钥解密:

openssl rsautl -decrypt -inkey nixops.pem -in file.bin 

4.4 加解密大文件

用公钥加密:

openssl  smime  -encrypt -aes256  -in  Large.zip  -binary  -outform DEM  -out  Encrypted.zip  pub.pem

用私钥解密:

openssl  smime -decrypt  -in  Encrypted.zip  -binary -inform DEM -inkey nixops.pem  -out  Large.zip 

五、证书格式转化

一般有以下几种标准格式:

  • .DER .CER : 二进制格式,只保存证书,不保存私钥。
  • .PEM :文本格式,可保存证书,可保存私钥,通常网上的.key后缀的私钥,其实就是PEM格式。
  • .CRT :可以是二进制格式,可以是文本格式,只保存证书,不保存私钥。
  • .PFX .P12 :即PKCS12,是二进制格式,同时包含证书和私钥,一般有密码保护。
  • .JKS :JAVA的专属二进制格式,同时包含证书和私钥,一般有密码保护。

5.1 DER/CER/CRT 转 PEM

先查看证书信息,在转格式:

openssl x509 -in cert.der -inform der -text -noout
openssl x509 -in cert.der -inform der -outform pem -out cert.pem

5.2 PEM转DER/CER/CRT

openssl x509 -in cert.pem -text -noout
openssl x509 -in cert.pem -outform der -out cert.der

5.3 PFX转PEM

openssl pkcs12 -info -nodes -in site.pfx
openssl pkcs12 -in site.pfx -out site.pem -nodes

5.4 JKS转PEM

需要JDK中提供的keytool工具配合openssl,先用keytool转成PKCS12格式:

keytool -importkeystore -srckeystore cert.jks -destkeystore cert.pkcs -srcstoretype JKS -deststoretype PKCS12

在用openssl转成pem格式:

openssl pkcs12 -in cert.pkcs -out cert.pem

六、其它一些技巧

6.1 移除证书中的密码

openssl rsa -in cert.key -out nopass.key

6.2 查看公钥的hash

openssl x509 -noout -hash -in cert.pem

6.3 查看在线网站的证书信息

openssl s_client -connect www.baidu.com:443 -showcerts

6.4 查看网站证书的有效期

查看本地证书:

openssl x509 -dates -noout -in file.pem  #查看证书签发时间和有效期
openssl x509 -startdate -noout -in file.pem #查看签发时间
openssl x509 -enddate -noout -in file.pem   #查看有效时间
openssl x509 -checkend 86400 -noout -in file.pem #检查证书是否在一天内过期,用echo $?即可判断

查看在线证书:

openssl s_client -connect www.baidu.com:443 -servername www.baidu.com 2> /dev/null |  openssl x509 -noout  -dates

提取过期时间:

openssl s_client  -connect www.baidu.com:443 -servername www.baidu.com 2>/dev/null |openssl x509 -enddate -noout |cut -d "=" -f 2

用date命令转换一下日期格式:

date --date="$(openssl s_client  -connect www.baidu.com:443 -servername www.baidu.com 2>/dev/null |openssl x509 -enddate -noout |cut -d "=" -f 2)" --iso-8601

6.5 检查网站是否接受指定版本的SSL协议

协议有TLS 1.0(tls1)、TLS 1.1(tls1_1) TLS 1.2(tls1_2),在高版本的openssl中默认已经禁用了SSL V2(ssl2)、SSL V3(ssl3)

openssl s_client  -connect www.baidu.com:443 -tls1

6.6 检查网站是否支持指定的加密算法

openssl s_client  -connect www.baidu.com:443 -tls1_2 -cipher 'ECDHE-RSA-AES128-GCM-SHA256'

参考文章:
https://jamielinux.com/docs/openssl-certificate-authority/index.html
https://stackoverflow.com/questions/21297853/how-to-determine-ssl-cert-expiration-date-from-a-pem-encoded-certificate
https://geekflare.com/openssl-commands-certificates/