作者:某公司移动应用部
Openssl 常用命令 准备工作
建立demoCA目录,在demoCA目录下建立四个文件夹分别是:certs、crl、newcerts、private。在demoCA目录下,建立CA的数据库文件(index.txt)和序列号文件(serial)
touchindex.txt echo 01 > serial
openssl ca命令注意如下:
1、所以在使用 ca 子命令前,需要先进入 demoCA/ 目录的上级目录
2、ca 命令需要读取的文件 :
1)、CA 证书 2)、CA 的 private key 3)、所签发的证书的文本数据库:index.txt 4)、序列号文件: serial
服务器证书
server.key opensslgenrsa -out server.key 1024
加密server.key opensslgenrsa –out server.key –des3 2048
解密 opensls rsa –inserver.key –out server.key
server.crt openssl req -new -x509 -keyserver.key -out server.crt -days 7300
server.p7b->server.crt openssl pkcs7 -print_certs -inform DER -in server.p7b -outserver.crt
如果想一次性生成server.crt & server.key openssl req –new –x509 –nodes–out server.crt –keyout server.key
客户端证书
client.key openssl genrsa -out client.key 1024
client.crs openssl req -new -out client.csr -key client.key
client.crt openssl x509 -req -in client.csr -out client.crt -CAserver.crt -CAkey server.key - CAcreateserial -days 1825 (无index.txt和 serial 情况下的命令) 或(用ca命令的前提条件要求index.txt和serial,必须在demoCA目录的父目录下)
openssl ca –in demoCA/client.csr –out demoCA/client.crt–keyfile demoCA/private/server.key –cert demoCA/private/server.crt client.p12 openssl pkcs12 -export -clcerts -in ssl.crt -inkeyssl.key -out ssl.p12 -passout pass:123
client.pfx openssl pkcs12 -export -clcerts -in client.crt -inkeyclient.key -out client.pfx
补充 openssl pkcs12 -export-in a.crt -inkey a.key -out a.pfx -passin pass:aaaa -passout pass:bbbb aaaa是解密key的口令,bbbb是输出的pfx口令
client.p12àclient.crt , client.key openssl pkcs12 –clcerts –nokeys–in client.p12 –password pass:123456 -out client.crt openssl pkcs12 -in client..p12-password pass:123456 -nocerts -nodes -out client.key client.txtàclient.crt 对client.txt进行签名的命令 opensslca -in demoCA/client.txt -out demoCA/clientreq.crt -certdemoCA/private/server.crt -keyfile demoCA/private/server.key
验证证书
openssl verify -CAfileserver.crt client.crt (server.crt client.crt必须为PEM编码的证书)
证书撤销列表
召回一个证书(ssl.crt) openssl ca –revoke demoCA/ssl.crt –keyfiledemoCA/private/server.key –cert demoCA/private/server.crt
产生crl列表 openssl ca –gencrl –keyfiledemoCA/private/server.key –cert demoCA/private/server.crt –out demoCA/crl/server.crl
召回一个证书(client.crt): openssl ca -revokedemoCA/client.crt -keyfile demoCA/private/serve r.key -certdemoCA/private/server.crl
产生crl列表 openssl ca –gencrl –keyfiledemoCA/private/server.key –cert demoCA/private/server.crt –out demoCA/crl/server.crl
撤销列表编码转换 openssl crl -inform PEM -in server.crl -outform DER -out server-der.crl
显示撤销列表内容 显示PEM编码撤销列表内容 openssl crl –inform PEM –inserver.crl –text –noout
显示DER编码撤销列表内容 openssl crl –inform DER –inserver.crl –text -noout
证书格式转换
基础知识: DER 编码的二进制 X.509
ITU-TRecommendation X.509 中定义的 ASN.1 DER(区别编码规则)与 ITU-T Recommendation X.209中定义的 ASN.1 BER(基本编码规则)相比,是一个限制更严格的编码标准,它构成了 DER 的基础。BER 和 DER 都提供了独立于平台的编码对象(如证书和消息)的方法,以便于其在设备和应用程序之间的传输。
在证书编码期间,多数应用程序都使用 DER,因为证书的一部分(CertificationRequest 的 CertificationRequestInfo)必须使用 DER 编码,才能对其进行签名。
不在运行 Windows Server 2003 计算机上的证书颁发机构也可能使用该格式,因此它支持互操作性。DER 证书文件使用 .cer 扩展名。
Base64 编码的 X.509
这种编码方式主要是为使用“安全/多用途 Internet 邮件扩展 (S/MIME)”而开发的(S/MIME 是一种通过 Internet 传输二进制附件的常用标准方法)。Base64 将文件编码为 ASCII 文本格式,这样可以减少传送的文件在通过 Internet 网关时被损坏的机率,同时,S/MIME 可以为电子消息发送应用程序提供一些加密安全服务,包括通过数字签名来证明原件(非拒绝),通过加密、身份验证和消息完整性来保证隐私和数据安全。
MIME(多用途 Internet 邮件扩展)标准(RFC 1341 及其后继者)定义了为传送电子邮件而进行任意二进制信息编码的一种机制。
由于所有符合 MIME 标准的客户端都可以对 Base64 文件进行解码,不在运行 Windows Server 2003 计算机上的证书颁发机构也可以使用该格式,所以它支持互操作性。Base64 证书文件使用 .cer 扩展名。
证书的编码为DER编码,但DER编码的文件是二进制格式不利于读写和传播,所以对DER编码的数据进行BASE64编码形成了PEM。 X.509是常见通用的证书格式。所有的证书都符合为Public keyInfrastructure 制定的ITU-T x509国际标准。
PKCS #7常用的后缀是: P7B, P7C, SPC
PKCS #12常用的后缀有: P12 ,PFX
X.509 DER编码(ASCII)的后缀是: DER CER CRT
X.509PEM编码(base64)的后缀是:PEM CER CRT
cer/crt证书: 用于存储公钥证书的文件格式,它是二进制存放的,不含私钥,不能导入到个人存储区,因为个人存储区存储与私钥相关的数字证书
pfx/p12证书:含有证书和对应的私钥,可以导入IE的个人证书存储区
pem格式是经过base64编码的证书,der格式是DER编码的证书,p12格式的证书一般用于证书的分发,里面包含了证书和对应的私钥,
cer、crt格式只是一个后缀,该后缀的证书可以pem编码的也可以是der编码的
CER、CRT 后缀的证书文件有两种编码àDER二进制编码或者base64编码(.pem)
Openssl使用PEM格式来存放各种信息,它是openssl默认采用的信息存放方式。Openssl中的PEM文件一般包含如下信息:
1) 内容类型 表明本文件存放的是什么信息内容,它的形式为“-------BEGIN XXXX ------”,与结尾的“------ENDXXXX------”对应。
2) 头信息 表明数据是如果被处理后存放,openssl中用的最多的是加密信息,比如加密算法以及初始化向量iv。
3) 信息体 为BASE64编码的数据。 Openssl生成PEM格式文件的大致过程如下: 1) 将各种数据DER编码; 2) 将1)中的数据进行加密处理(如果需要); 3) 根据类型以及是否加密,构造PEM头; 4) 将2)中的数据进行BASE64编码,放入PEM文件。 pfx证书在导出时, 只能选择”不, 不要导出私钥” ”要导出私钥”被灰化了不能选择,所以只能导出现cer格式的证书 导入数字证书时,也提示改入成功,可是证书不在原来的”个人存储区里” 解决方法是: 在安装证书的时候, 在标识此密钥可导出的.这将允许您在稍后备份或传输密钥选勾. 但由于某公司 Proxy是PEM格式Prefer的,不支持DER经编码的证书,因此,要通过证书的编码转换,把DER编码转换为PEM编码,再经某公司处理。
格式转换: client.cer àclient.der:相当于编码由PEMàDER openssl x509 –in test.cer –outform DER –out test.der client.deràclient.cer:相当于编码由DERàPEM openssl x509 -inform DER -in test.der -outform PEM -out test-pem.der
PKCS7格式转换: openssl pkcs7 -informDER -in test.p7b -out test-pem.p7b
显示证书内容
asn1parse 用来解析ASN1编码的数据
asn1parse [options]<infile
-inform DER|TXT|PEM 输入格式
-in filename
-out filename 通常是DER编码
-noout 不输出
-offset number 开始解析的位置
-length number 需要解析的字节数
-i 缩进(indent)
-dump 对不可见数据显示16进制
asn1parse -inform DER -in ca.cer -i
显示结果:xx: 冒号前的代表起始字节数,d: 深度(用于缩进),hl:TLV种的TL,l: TLV中的L
0:d=0 hl=3 l= 137 cons: SEQUENCE
3:d=1 hl=3 l= 129 prim:INTEGER :E5D21E1F5C8D20.....
135:d=1 hl=2 l= 3 prim:INTEGER :010001 openssl asn1parse -inform DER -in test.der –i
显示不同编码的证书内容
显示DER编码证书内容: Openssl x509 –inform DER–in test..cer
显示PEM编码证书内容: Openssl x509 –inform PEM –intest.cer -text 0penssl x509 –inform PEM –in test.cer –text –noout
显示PEM编码证书撤销列表: Openssl crl –inform PEM –inserver.crl –text Openssl crl –inform PEM –inserver.crl –text –noout
显示不同格式的证书内容
Pkcs7(从IE导出*.p7b证书默认为DER编码): 显示DER编码的p7b证书内容: Openssl pkcs7-print_certs -inform DER -in test.p7b
PKCS7格式转换(DERàPEM): openssl pkcs7 -informDER -in test.p7b -out test-pem.p7b
显示PEM编码的p7b证书内容 Openssl pkcs7 –print_certs –in test-pem.p7b
检查私钥和证书匹配
详细资料来源: Verifying that a Private Key Matches a Certificate How to verify that a private key goeswith a certificate The private key contains a series ofnumbers. Two of those numbers form the "public key", the others arepart of your "private key". The "public key" bits are alsoembedded in your Certificate (we get them from your CSR). To check that thepublic key in your cert matches the public portion of your private key, youneed to view the cert and the key and compare the numbers. To view theCertificate and the key run the commands: $ openssl x509 -noout -text -in server.crt$ openssl rsa -noout -text -in server.keyThe `modulus' and the `public exponent'portions in the key and the Certificate must match. But since the publicexponent is usually 65537 and it's bothering comparing long modulus you can usethe following approach: $ openssl x509 -noout -modulus -in server.crt | openssl md5$ openssl rsa -noout -modulus -in server.key | openssl md5And then compare these really shorternumbers. With overwhelming probability they will differ if the keys aredifferent. As a one-liner: $ openssl x509 -noout -modulus -in server.pem | openssl md5 ;\ openssl rsa -noout -modulus -in server.key | openssl md5And with auto-magic comparison (If morethan one hash is displayed, they don't match): $ (openssl x509 -noout -modulus -in server.pem | openssl md5 ;\ openssl rsa -noout -modulus -in server.key | openssl md5) | uniqBTW, if I want to check to which key orcertificate a particular CSR belongs you can compute $ openssl req -noout -modulus -in server.csr | openssl md5
从证书中得出私钥modulus Opensslx509 –noout –modulus –in server.crt | openssl md5
从私钥中得出modulus Opensslrsa –noout –modulus –in server.key | openssl md5 |