OpenSSL是一个功能极其强大的命令行工具,能够用来完成公钥体系(Public Key Infrastructure)及HTTPS相关的不少任务。这个速查手册整理了经常使用的OpenSSL命令的使用方法,例如生成私钥、生成证书签名请求以及证书格式转换等。node
若是你要从证书颁发机构(CA)获取一个SSL证书,那首先须要先生成一个证书签名请求(CSR)。CSR的主要内容是密钥对中的公钥,以及一些额外的信息 —— 这些内容都将在签名时插入到证书里。git
当使用openssl生成证书签名请求时,须要输入证书的惟一标识信息(Distinguished Name),其中重要的一项是常见名(Common Name),它应当是你要部署证书的主机的域名全称(FQDN)。web
DN中的其余条目用来提供关于你的机构的额外信息。若是你在从证书颁发机构购买SSL证书,那么一般也须要这些额外的字段,例如组织机构(Organization),以便可以真实地展现你的机构详情。算法
下面是CSR的模样:浏览器
Country Name (2 letter code) [AU]:US State or Province Name (full name) [Some-State]:New York Locality Name (eg, city) []:Brooklyn Organization Name (eg, company) [Internet Widgits Pty Ltd]:Example Brooklyn Company Organizational Unit Name (eg, section) []:Technology Division Common Name (e.g. server FQDN or YOUR name) []:examplebrooklyn.com Email Address []:
也能够非交互方式提供生成CSR时要求的信息,任何须要CSR信息的OpenSSL命令均可以添加 -subj
选项。例如:服务器
-subj "/C=US/ST=New York/L=Brooklyn/O=Example Brooklyn Company/CN=examplebrooklyn.com"
这一部分涵盖与生成CSR(以及私钥)相关的OpenSSL命令。CSR能够用来从证书颁发机构 请求SSL证书。dom
记住,你能够交互式的添加CSR信息,也可使用-subj
选项以非交互的方式添加一样的信息。工具
若是你须要使用HTTPS来加固你的web服务器,那么你会向证书颁发机构申请一个证书。这里 生成的CSR能够发送给CA来发行其签名的SSL证书。ui
下面的命令建立一个2048位的私钥(domain.key)以及一个CSR(domain.csr):编码
openssl req \ -newkey rsa:2048 -nodes -keyout domain.key \ -out domain.csr
这里须要交互地输入CSR信息,以便完成整个过程。
-newkey rsa:2048
选项声明了使用RAS算法生成2048位的私钥。-nodes
选项代表咱们不使用密码加密私钥。上面隐含了-new
选项,表示要生成一个CSR。
若是你已经有了一个私钥,那么能够直接用它来向CA申请证书。
下面的命令使用一个已有的私钥(domain.key)建立一个新的CSR(domain.csr):
openssl req \ -key domain.key \ -new -out domain.csr
-key
选项用来指定已有的私钥文件,-new
选项代表咱们要生成一个CSR。
若是你须要续订已有的证书,但你和CA都没有原始的CSR,那能够再次生成CSR。
例如,下面的命令使用已有的证书(domain.crt)和私钥(domain.key)建立一个新的CSR:
openssl x509 \ -in domain.crt \ -signkey domain.key \ -x509toreq -out domain.csr
-x509toreq
选项代表咱们要使用X509证书来制做CSR。
若是你只是想用SSL证书加固你的web服务器,可是并不须要CA签名的证书,那么一个简单的方法是本身签发证书。
一种常见的你能够签发的类型是自签名证书 —— 使用本身的私钥签发的证书。自签名证书能够向CA签发的证书同样用于加密数据,可是你的用户将收到提示说明该证书不被其计算机或浏览器信息。所以,自签名证书只能在不须要向用户证实你的身份时使用,例如非生产环境或者非公开服务。
这一部分的内容涵盖自签名证书生成相关的OpenSSL命令。
若是你须要使用HTTPS加固服务器,但不须要CA签发的证书,就可使用自签名证书。
下面的命令建立一个2048位的私钥(domain.key)以及一个自签名证书(domain.crt):
openssl req \ -newkey rsa:2048 -nodes -keyout domain.key \ -x509 -days 365 -out domain.crt
-x509
选项指出咱们要建立自签名证书,-days 365
选项声明该证书的有效期为365天。在上面的命令执行过程当中将建立一个临时CSR来收集与证书相关的CSR信息。
也可使用已有私钥来生成自签名证书。例如,下面的命令使用已有的私钥(domain.key)生成一个自签名证书(domain.crt):
openssl req \ -key domain.key \ -new \ -x509 -days 365 -out domain.crt
-new
选项用来启动CSR信息采集提示。
第三种办法是使用已有的私钥和CSR来生成自签名证书。例如,下面的命令使用私(domain.key)和CSR(domain.csr)建立一个自签名证书(domain:crt):
openssl x509 \ -signkey domain.key \ -in domain.csr \ -req -days 365 -out domain.crt
证书和CSR文件都采用PEM编码格式,并不适合人类阅读。这一部分主要介绍OpenSSL中查看PEM编码文件的命令。
下面的命令能够查看CSR文件的明文文本并进行验证:
openssl req -text -noout -verify -in domain.csr
下面的命令能够查看证书文件的明文文本:
openssl x509 -text -noout -in domain.crt
下面的命令用来验证证书doman.crt是否由证书颁发机构(ca.crt)签发:
openssl verify -verbose -CAFile ca.crt domain.crt
这部分介绍与私钥生成和验证相关的OpenSSL命令。
下面的命令建立一个密码保护的2048位私钥domain.key:
openssl genrsa -des3 -out domain.key 2048
上面命令会提示输入密码。
下面的命令能够验证私钥domain.key是否有效:
openssl rsa -check -in domain.key
若是私钥是加密的,命令会提示输入密码,验证密码成功则会显示不加密的私钥。
使用下面的命令验证私钥domain.key是否与证书domain.crt以及CSR匹配:
openssl rsa -noout -modulus -in domain.key | openssl md5 openssl x509 -noout -modulus -in domain.crt | openssl md5 openssl req -noout -modulus -in domain.csr | openssl md5
若是上面三个命令的输出一致,那么有极高的几率能够认为私钥、证书和CSR是相关的。
下面的命令将私钥unencrypted.key加密,输出加密后的私钥encrypted.key:
openssl rsa -des3 \ -in unencrypted.key \ -out encrypted.key
上面命令执行时会提示设置密码。
下面的命令将加密私钥encrypted.key解密,并输出明文结果:
openssl rsa \ -in encrypted.key \ -out decrypted.key
上面命令执行时会提示输入解密密码。
咱们以前接触的证书都是X.509格式,采用ASCII的PEM编码。还有其余一些证书编码格式与容器类型。OpenSSL能够用来在众多不一样类型之间转换证书。这一部分主要介绍与证书格式转换相关的OpenSSL命令。
能够将PEM编码的证书domain.crt转换为二进制DER编码的证书domain.der:
openssl x509 \ -in domain.crt \ -outform der -out domain.der
DER格式一般用于Java。
一样,能够将DER编码的证书(domain.der)转换为PEM编码(domain.crt):
openssl x509 \ -inform der -in domain.der \ -out domain.crt
能够将PEM证书(domain.crt和ca-chain.crt)添加到一个PKCS7(domain.p7b)文件中:
openssl crl2pkcs7 -nocrl \ -certfile domain.crt \ -certfile ca-chain.crt \ -out domain.p7b
使用-certfile
选项指定要添加到PKCS7中的证书。
PKCS7文件也被称为P7B,一般用于Java的Keystore和微软的IIS中保存证书的ASCII文件。
使用下面的命令将PKCS7文件(domain.p7b)转换为PEM文件:
openssl pkcs7 \ -in domain.p7b \ -print_certs -out domain.crt
若是PKCS7文件中包含多个证书,例如一个普通证书和一个中间CA证书,那么输出的PEM文件中将包含全部的证书。
能够将私钥文件(domain.key)和证书文件(domain.crt)组合起来生成PKCS12 文件(domain.pfx):
openssl pkcs12 \ -inkey domain.key \ -in domain.crt \ -export -out domain.pfx
上面的命令将提示你输入导出密码,能够留空不填。
PKCS12文件也被称为PFX文件,一般用于导入/导出微软IIS中的证书链。
也能够将PKCS12文件(domain.pfx)转换为PEM格式(domain.combined.crt):
openssl pkcs12 \ -in domain.pfx \ -nodes -out domain.combined.crt
注意若是PKCS12文件中包含多个条目,例如证书及其私钥,那么生成的PEM文件中将包含全部条目。