本文简要介绍CA和证书的基础知识,并演示openssl-1.0.2d的安装,CA证书生成、用户证书申请、使用CA签发用户证书等内容。另外,可以参考本人的其他文章如nginx教程,进行生成证书的验证。
By 泪痕之木
实验环境
操作系统:CentOS 6.7
主机名:centos6
openssl版本:openssl-1.0.2d.tar.gz(官网获取)
1 基础知识
1.1 PKI
为解决Internet的安全问题,世界各国对其进行了多年的研究,初步形成了一套完整的Internet安全解决方案,即目前被广泛采用的PKI体系结构。
它是利用公开密钥技术所构建的,解决网络安全问题的,普遍适用的一种基础设施。美国政府的一个报告中把 PKI 定义为全面解决安全问题的基础结构,从而大大扩展了 PKI 的概念。而我们认为,采用了公开密钥技术的基础设施就可以称为 PKI 。公开密钥技术也就是利用非对称算法的技术。
PKI(PublicKeyInfrastructure)公钥基础设施是提供公钥加密和数字签名服务的系统或平台,目的是为了管理密钥和证书。PKI体系结构采用证书管理公钥,通过第三方的可信机构CA,把用户的公钥和用户的其他标识信息(如名称、e-mail、***号等)捆绑在一起,在Internet网上验证用户的身份,PKI体系结构把公钥密码和对称密码结合起来,在Internet网上实现密钥的自动管理,保证网上数据的机密性、完整性。
PKI 中最基本的元素就是数字证书。所有安全的操作主要通过证书来实现。 PKI 的硬设备还包括签置这些证书的证书机构 (CA) ,登记和批准证书签置的登记机构 (RA) ,以及存储和发布这些证书的电子目录。 PKI 中还包括证书策略,证书路径以及证书的使用者。所有这些都是 PKI 的基本元素。许多这样的基本元素有机地结合在一起就构成了 PKI 。
由于PKI体系结构是目前比较成熟、完善的Internet网络安全解决方案,国外的一些大的网络安全公司纷纷推出一系列的基于PKI的网络安全产品,如美国的Verisign,IBM,Entrust等安全产品供应商为用户提供了一系列的客户端和服务器端的安全产品,为电子商务的发展提供了安全保证。为电子商务、政府办公网、EDI等提供了完整的网络安全解决方案。
1.2 数字证书
1.2.1 数字证书简介
数字证书采用PKI(Public Key Infrastructure)公开密钥基础架构技术,利用一对互相匹配的密钥进行加密和解密。
每个用户自己设定一把特定的仅为本人所知的私有密钥(私钥),用它进行解密和签名;同时设定一把公共密钥(公钥),由本人公开,为一组用户所共享,用于加密和验证签名。当发送一份保密文件时,发送方使用接收方的公钥对数据加密,而接收方则使用自己的私钥解密,通过数字的手段保证加解密过程是一个不可逆过程,即只有用私有密钥才能解密,这样保证信息安全无误地到达目的地。用户也可以采用自己的私钥对发送信息加以处理,形成数字签名。由于私钥为本人所独有,这样可以确定发送者的身份,防止发送者对发送信息的抵赖性。接收方通过验证签名还可以判断信息是否被篡改过。即使已知明文、密文和加密密钥(公开密钥),想要推导出解密密钥(私密密钥),在计算上是不可能的。按现在的计算机技术水平,要破解目前采用的2048位RSA密钥,需要上千年的计算时间。
1.2.2 数字证书颁发机构-CA
数字证书是由认证中心颁发的,认证中心是一家能向用户签发数字证书以确认用户身份的管理机构,这样的证书颁发管理机构一般称为CA。
为了防止数字凭证的伪造,认证中心的公共密钥必须是可靠的,认证中心必须公布其公共密钥或由更高级别的认证中心提供一个电子凭证来证明其公共密钥的有效性,后一种方法导致了多级别认证中心的出现。
CA也拥有一个证书(内含公钥和私钥)。网上的公众用户通过验证 CA 的签字从而信任 CA ,任何人都可以得到 CA 的证书公钥,用以验证它所签发的证书。
数字证书颁发过程如下:用户首先产生自己的密钥对,并将公共密钥及部分个人身份信息传送给认证中心。认证中心在核实身份后,将执行一些必要的步骤,以确信请求确实由用户发送而来,然后,认证中心将发给用户一个数字证书,该证书内包含用户的个人信息和他的公钥信息,同时还附有认证中心的签名信息。用户就可以使用自己的数字证书进行相关的各种活动。
如果一个用户想鉴别另一个证书的真伪,他会用 CA 的公钥对该证书上的签字进行验证,一旦验证通过,该证书就被认为是有效的。证书实际是由证书签证机关(CA)签发的对用户的公钥的认证。
通常情况下,证书的内容包括:电子签证机关的信息、公钥用户信息、公钥、权威机构的签字和有效期等等。
目前,证书的格式和验证方法普遍遵循X.509 国际标准。
1.2.3 数字证书解决的问题
在使用数字证书的过程中应用公开密钥加密技术,建立起一套严密的身份认证系统,它能够保证:
信息除发送方和接受方外不被其他人窃取;
信息在传输过程中不被篡改;
接收方能够通过数字证书来确认发送方的身份;
发送方对于自己发送的信息不能抵赖。
以电子邮件证书为例,数字证书主要可以解决:
保密性:通过使用收件人的数字证书对电子邮件加密,只有收件人才能阅读加密的邮件,这样保证在Internet上传递的电子邮件信息不会被他人窃取,即使发错邮件,收件人由于无法解密而不能够看到邮件内容。
完整性:利用发件人数字证书在传送前对电子邮件进行数字签名不仅可确定发件人身份,而且可以判断发送的信息在传递的过程中是否被篡改过。
身份认证:在Internet上传递电子邮件的双方互相不能见面,所以必须有方法确定对方的身份。利用发件人数字证书在传送前对电子邮件进行数字签名即可确定发件人身份,而不是他人冒充的。
不可否认性:发件人的数字证书只有发件人唯一拥有,故发件人利用其数字证书在传送前对电子邮件进行数字签名后,发件人就无法否认发送过此电子邮件。
1.3 SSL证书
随着Internet的普及、各种电子商务活动和电子政务活动的飞速发展,数字证书开始广泛地应用到各个领域之中,目前主要包括:访问安全站点(服务器证书,即SSL证书)、软件安全认证(代码签名证书)、发送安全电子邮件(个人电子邮件证书)、网上招标投标、网上签约、网上订购、安全网上公文传送、网上缴费、网上缴税、网上炒股、网上购物和网上报关(个人签名及加密证书)等。
1.3.1 SSL简介
SSL(Secure Sockets Layer,安全套接层)是支持在网络服务器(主机)与网页浏览器(客户端)间建立加密连接的标准技术。运用SSL技术后,保证了主机与客户端连接过程中的数据安全。随着电子商务的发展,越来越多的运用SSL保护用户在线交易的安全性。如果您访问某网站时,在浏览器地址栏输入的地址以“https://”开头,则代表您正通过SSL建立安全连接。
使用SSL证书后,即在用户网络浏览器及网络服务器间创建了加密数据连接,这也就意味着,服务器与浏览器间的任何交易数据在解密前是不可读的。因此,正由于加密数据不易理解性,也防止了网络中的第三者窥探数据信息。
如何建立加密连接
在尝试建立安全连接前,需要进行以下三步操作:
1、在地址栏输入或选择安全URL,例如“https://www.baidu.com”;
2、服务器在收到您发送的安全连接请求后,提交尝试在浏览器与服务器间建立可信任连接的回复,这也就是所谓的“SSL握手”;
3、通过SSL握手验证SSL证书后,服务器与客户端间的数据将会以加密的形式传输,保证其隐私与安全。
1.3.2 如何辨别网站是否使用SSL
如果网站使用了SSL证书,虽然SSL协议具体内容并不会直接展示给用户,但大部分浏览器支持在地址栏显示一个锁的图案或其他形式证明其使用了SSL,这也表明了您目前正享受SSL加密会话的保护。如果您想了解SSL证书详细信息,只需点击地址栏头部“锁”的图标即可。
1.3.3 SSL对访问者意味着什么
大部分SSL证书包含域名、公司名称、国家及详细地址,当然也包含证书的有效期与证书颁发机构的详细信息。当浏览器尝试与网站建立SSL连接时,会首先核实证书是否过期,是否由可信任的机构颁发以及网站是否正确。如果有任一项出现错误,浏览器将会提示警告,告知用户网站未使用SSL。
2 openssl安装
将下载的openssl安装包上传至服务器,这里上传到了/root目录
[[email protected] ~]# ls
anaconda-ks.cfg install.log.syslog 公共的 视频 文档 音乐
install.log openssl-1.0.2d.tar.gz 模板 图片 下载 桌面
openssl安装依赖于gcc包,需先配置YUM源,安装gcc
[[email protected] ~]# vi /etc/yum.repos.d/rhel6.repo
[RHEL6.7]
name=RHEL6.7-ISO
baseurl=file:///mnt #这里将光盘挂载到了/mnt目录,所以指定YUM的路径为/mnt
gpgcheck=0
enabled=0
[[email protected] ~]# yum clean all
[[email protected] openssl-1.0.2d]# yum install gcc\* -y
注:如果未安装gcc,直接编译openssl会有如下错误提示
make[1]: gcc:命令未找到
make[1]: *** [cryptlib.o] 错误 127
make[1]: Leaving directory `/root/openssl-1.0.2d/crypto‘
make: *** [build_crypto] 错误 1
解压openssl安装包,并设置安装目录为/usr/local/openssl-1.0.2d
[[email protected] ~]# tar zxvf openssl-1.0.2d.tar.gz
[[email protected] ~]# cd openssl-1.0.2d
[[email protected] openssl-1.0.2d]# ./config --prefix=/usr/local/openssl-1.0.2d
编译并安装openssl
[[email protected] openssl-1.0.2d]# make && make install
创建openssl命令的软链接,相当于Windows的快捷方式
[[email protected] openssl-1.0.2d]# ln -s /usr/local/openssl-1.0.2d/bin/openssl /usr/bin/openssl
查看已安装openssl的版本
[[email protected] ~]# openssl
OpenSSL> version
OpenSSL 1.0.2d 9 Jul 2015
3 使用CA颁发证书
3.1 创建CA目录结构
建立CA目录结构
[[email protected] openssl-1.0.2d]# cd /usr/local/openssl-1.0.2d/ssl
[[email protected] ssl]# mkdir -p CA/{private,newcerts}
创建证书数据库文件和序号文件
[[email protected] ssl]# cd CA/
[[email protected] CA]# touch index.txt
[[email protected] CA]# echo ‘01‘ > serial
查看已经创建的目录及文件
[[email protected] CA]# ls
certs index.txt private serial
注:CA的目录、文件、证书、私钥名称等都在/usr/local/openssl-1.0.2d/ssl/oopenssl.cnf中存在相关配置,如果需要更改这些内容,请现在openssl.cnf中更改相应设置项
3.2 编辑openssl配置文件
在openssl配置文件中指定创建的CA目录
将配置文件中默认的“dir = ./demoCA”修改为“dir = /usr/local/openssl-1.0.2d/ssl/CA”
[[email protected] CA]# pwd
/usr/local/openssl-1.0.2d/ssl/CA
[[email protected] CA]# vim ../openssl.cnf
3.3 CA根证书生成
3.3.1 生成RSA私钥
私钥一般会加密,生成过程需要指定加密口令,这里设置的是“123456”
[[email protected] CA]# openssl genrsa -des3 -out private/cakey.pem
Generating RSA private key, 2048 bit long modulus
.+++
..................................+++
e is 65537 (0x10001)
Enter pass phrase for private/cakey.pem:123456
Verifying - Enter pass phrase for private/cakey.pem:123456
注:需要输入pass phrase的地方,输入是没有任何显示的,在文档中实际标注,只是为了便于理解。
注:-des|-des3|-idea|-aes128|-aes192|-aes256 指定私钥口令保护算法,如果不指定,私钥将被明文存放
如果不想加密私钥,将私钥明文存放
[[email protected] CA]# openssl genrsa -out private/cakey.pem
注:numbits 生成密钥的位数。必须是本指令的最后一个参数。如果没有指明,该openssl版本生成2048位密钥
如果要生成4096位密钥
[[email protected] CA]# openssl genrsa -des3 -out private/cakey.pem 4096
如果需要将已经加密的私钥转换为不加密
[[email protected] CA]# openssl rsa -in serverkey.pem -out serverkey2.pem
查看生成的RSA私钥
[[email protected] CA]# openssl rsa -noout -text -in private/cakey.pem
Enter pass phrase for private/cakey.pem:
3.3.2 使用私钥生成证书请求
[[email protected] CA]# openssl req -new -key private/cakey.pem -out careq.pem
Enter pass phrase for private/cakey.pem:123456
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter ‘.‘, the field will be left blank.
-----
Country Name (2 letter code) [AU]:cn
State or Province Name (full name) [Some-State]:cn
Locality Name (eg, city) []:cn
Organization Name (eg, company) [Internet Widgits Pty Ltd]:cn
Organizational Unit Name (eg, section) []:cn
Common Name (e.g. server FQDN or YOUR name) []:ca.lhzm.com
Email Address []:[email protected]
Please enter the following ‘extra‘ attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
注:使用私钥生成请求的过程中,需要输入调用私钥的口令
注:这里需要输入国家,地区,组织,email等。最重要的是 Common Name,可以写你的域名或主机名。如果为了 https 申请,这个必须和域名一样。即,如果要申请域名“www.abc.com”这里要写 “www.abc.com”,否则某个网站使用域名和证书Common Name不一致,访问该网站会引发浏览器警报。这里也可以用“ *.abc.com ”来做泛域名证书。
注:证书签发时不指定policy参数的话,默认openssl配置文件中调用的是policy_match策略,所有的非optional项都必须填写。下面是openssl.cnf配置文件中policy-match策略的内容
3.3.3 生成自签名证书
由于目前还没有任何证书存在,所以这里通过自签名生成证书,所生成的证书可以称为自签名证书,该自签名证书可以看做此CA的根证书
[[email protected] CA]# openssl ca -selfsign -days 3650 -in careq.pem -out cacert.pem
Using configuration from /usr/local/openssl-1.0.2d/ssl/openssl.cnf
Enter pass phrase for /usr/local/openssl-1.0.2d/ssl/CA/private/cakey.pem:123456
Check that the request matches the signature
Signature ok
Certificate Details:
Serial Number: 1 (0x1)
Validity
Not Before: Dec 4 07:13:25 2015 GMT
Not After : Dec 1 07:13:25 2025 GMT
Subject:
countryName = cn
stateOrProvinceName = cn
organizationName = cn
organizationalUnitName = cn
commonName = ca.lhzm.com
emailAddress = [email protected]
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
Netscape Comment:
OpenSSL Generated Certificate
X509v3 Subject Key Identifier:
D3:A2:B4:D0:0E:FC:F5:71:97:02:74:A2:BA:25:23:8D:8E:D8:6D:4B
X509v3 Authority Key Identifier:
keyid:D3:A2:B4:D0:0E:FC:F5:71:97:02:74:A2:BA:25:23:8D:8E:D8:6D:4B
Certificate is to be certified until Dec 1 07:13:25 2025 GMT (3650 days)
Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
注:从“Using configuration from……”可以看出调用的是哪个openssl配置文件。
-days 该参数指定生成证书的有效期,以天为单位,这里指定的是10年。证书请求也可以使用该参数指定要申请的证书期限,但即使指定了申请期限,还是以这里的签发时间为准,也就是签发的优先级更高。如果不指定-days参数,也会调用openssl.cnf默认的时间设置365天。
注:自签名证书的证书请求和证书生成,可以将两步合二为一
[[email protected] CA]# openssl req -new -x509 -days 3650 -key private/cakey.pem -out cacert.pem
查看证书数据库文件,可以看到已经生成的证书信息
[[email protected] CA]# cat index.txt
V 251201071325Z 01 unknown /C=cn/ST=cn/O=cn/OU=cn/CN=ca.lhzm.com/[email protected]
查看创建的序号文件,可以看到颁发一个证书后,编号自动更新
[[email protected] CA]# cat serial
02
注:如果只是为了测试使用,目前得到的私钥cakey.pem和证书cacert.pem已经可以用作web程序私钥和SSL证书。
3.4 用户证书生成
3.4.1 生成RSA私钥
[[email protected] CA]# openssl genrsa -des3 -out private/lhzmkey.pem
Generating RSA private key, 2048 bit long modulus
.........................................................+++
.................................................................................................................+++
e is 65537 (0x10001)
Enter pass phrase for private/lhzmkey.pem:qwerty
Verifying - Enter pass phrase for private/lhzmkey.pem: qwerty
3.4.2 使用私钥生成证书请求
[[email protected] CA]# openssl req -new -key private/lhzmkey.pem -out lhzmreq.pem
Enter pass phrase for private/lhzmkey.pem: qwerty
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter ‘.‘, the field will be left blank.
-----
Country Name (2 letter code) [AU]:
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:*.lhzm.com
Email Address []:
Please enter the following ‘extra‘ attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
注:下一步的证书签发会演示使用policy参数,并指定policy_anything策略,所以这里只填写了Common Name
3.4.3 CA签发证书
使用CA证书签发用户证书申请,从而生成用户证书(用户证书代表某个用户对象向CA申请的证书,而不是计算机用户的意思)
[[email protected] CA]# openssl ca -policy policy_anything -days 730 -in lhzmreq.pem -out newcerts/lhzmcert.pem
Using configuration from /usr/local/openssl-1.0.2d/ssl/openssl.cnf
Enter pass phrase for /usr/local/openssl-1.0.2d/ssl/CA/private/cakey.pem:123456
Check that the request matches the signature
Signature ok
Certificate Details:
Serial Number: 2 (0x2)
Validity
Not Before: Dec 4 07:17:22 2015 GMT
Not After : Dec 3 07:17:22 2017 GMT
Subject:
countryName = AU
stateOrProvinceName = Some-State
organizationName = Internet Widgits Pty Ltd
commonName = *.lhzm.com
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
Netscape Comment:
OpenSSL Generated Certificate
X509v3 Subject Key Identifier:
68:8E:0B:E1:75:04:49:FC:87:FD:91:FB:6E:43:8F:45:50:B9:1B:A9
X509v3 Authority Key Identifier:
keyid:D3:A2:B4:D0:0E:FC:F5:71:97:02:74:A2:BA:25:23:8D:8E:D8:6D:4B
Certificate is to be certified until Dec 3 07:17:22 2017 GMT (730 days)
Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
注:由于这里使用CA公钥签发证书,所以签发过程会调用CA的私钥,输入的pass phrase是CA私钥“cakey.pem”的口令。
该证书包含CA信息、CA签字、用户信息、用户公钥、证书有效期等信息。
-policy 指定调用openssl.cnf的哪条策略,这里指定了policy_anything策略。
-cert 该参数可以指定签发证书的公钥
-keyfile 指定使用的私钥,调用的公钥和私钥必须是一对
[[email protected] CA]# openssl ca -policy policy_anything -days 730 -cert cacert.pem -keyfile private/cakey.pem -in lhzmreq.pem -out newcerts/lhzmcert.pem
查看证书数据库文件,可以看到已经生成的证书信息
[[email protected] CA]# cat index.txt
V 251201071325Z 01 unknown /C=cn/ST=cn/O=cn/OU=cn/CN=ca.lhzm.com/[email protected]
V 171203071722Z 02 unknown /C=AU/ST=Some-State/O=Internet Widgits Pty Ltd/CN=*.lhzm.com
查看创建的序号文件,可以看到颁发一个证书后,编号自动更新
[[email protected] CA]# cat serial
03
4 证书格式转换
4.1 PFX-PEM(pkcs12)
假设目前拥有PKCS#12用户证书server.pfx
l 只导出用户证书
openssl pkcs12 -in server.pfx -nokeys -nodes -out servercert.pem
l 用户私钥导出
openssl pkcs12 -in server.pfx -nocerts -nodes -out serverkey.pem
l CA证书导出
openssl pkcs12 -in server.pfx -cacerts -nokeys -out cacert.pem
选项:
-in filename:指定私钥和证书读取的文件,默认为标准输入。必须为PEM格式。
-out filename:指定输出的pkcs12文件,默认为标准输出。
-password arg:指定导入导出口令来源。
-passin arg:输入文件保护口令来源。
-passout arg:指定所有输出私钥保护口令来源。
-noout:不打印参数编码的版本信息。
-clcerts:仅仅输出客户端证书,不输出CA证书。
-cacerts:仅仅输出CA证书,不输出客户端证书。
-nocerts:不输出任何证书。
-nokeys:不输出任何私钥信息值。
-info:输出PKCS#12文件结构的附加信息值。例如用的算法信息以及迭代次数。
-des:在输出之前用DES算法加密私钥值。
-des3:在输出之前用3DES算法加密私钥值。此项为默认。
-idea:在输出之前用IDEA算法加密私钥值。
-aes128、-aes192、-aes256:在输出之前用AES算法加密私钥值。
-camellia128、-camellia192、-camellia256:在输出之前用camellia算法加密私钥值。
-nodes:对私钥不加密。
-nomacver:读取文件时不验证MAC值的完整性。
-twopass:需要用户分别指定MAC口令和加密口令。
文件创建选项:
-export:这个选项指定了一个PKCS#12文件将会被创建。
-in filename:指定私钥和证书读取的文件,默认为标准输入。必须为PEM格式。
-out filename:指定输出的pkcs12文件,默认为标准输出。
-inkey filename:指定私钥文件的位置。如果没有被指定,私钥必须在-in filename中指定。
-name name:指定证书以及私钥的友好名字。当用软件导入这个文件时,这个名字将被显示出来。
-certfilefilename:添加filename中所有的证书信息值。
-caname name:指定其它证书的友好名字。这个选项可以被用于多次。
-password arg:指定导入导出口令来源。
-passin arg:输入文件保护口令来源。
-passout arg:指定所有输出私钥保护口令来源。
-chain:如果这个选项被提出,则添加用户证书的证书链。标准CA中心用它来搜索。如果搜索失败,则是一个重大的错误。
-descert:用3DES对PKCS12进行加密,这样杨浦可能会导致PKCS12文件被一些“export grade”软件不能够读取。默认的是用3DES对私钥文件进行加密,用40位的RC2对证书公钥文件进行加密。
-certpbealg:该选项允许指定证书的加密算法。任何PKCS#5 v1.5或 PKCS#12 PBE类型的算法都可以被使用。默认使用的是40位的RC2。
-keypbe alg:该选项允许指定证书私钥的加密算法。任何PKCS#5 v1.5或 PKCS#12 PBE类型的算法都可以被使用。默认使用的是3DES。
-keyex:设置私钥仅仅被用于密钥交换。
-keysig:设置私钥仅仅被用于数字签名。
-macalg digest:指定MAC摘要算法。如果没有被指定,则默认使用sha1。
-nomaciter、-noiter:这个选项影响MAC值和密钥算法的迭代次数。除非你希望产生的文件能与MSIE 4.0相兼容,可以把这两个选项丢弃一边。
-maciter:加强完整性保护,多次计算MAC。
-nomac:不去规定MAC值的完整性。
-rand file(s):指定随机数种子文件,多个文件间用分隔符分开,windows用“;”,OpenVMS用“,“,其他系统用“:”。
-CApatharg:指定CA目录。该目录必须是一个标准证书目录:每个CA文件的文件名为XXXX.0,XXXX为其持有者摘要值。
-CAfile arg:指定CA文件。
-LMK:添加本地的机械属性到私钥中。
-CSP name:微软的CSP的名字。
-engine id:指定硬件引擎。
4.2 PEM-PFX(pkcs12)
假设目前拥有CA证书cacert.pem,用户证书servercert.pem,用户私钥serverkey.pem,需要生成PKCS12格式的server.pfx。
openssl pkcs12 -export -inkey serverkey.pem -in servercert.pem -certfile cacert.pem -out server.pfx
如果没有CA证书信息可添加,则不使用-certfile选项
openssl pkcs12 -inkey serverkey.pem -in servercert.pem -export -out server.pfx
4.3 PEM-DER/CER(x509)
由PEM格式证书文件servercert.pem输出DER格式文件servercert.der
openssl x509 -outform der -in servercert.pem -out servercert.der
选项:
-inform DER|PEM|NET 指定输入文件的格式。
-outform DER|PEM|NET 指定输出文件格式
-in filename 指定输入文件名
-out filename 指定输出文件名
-md2|-md5|-sha1|-mdc2 指定使用的哈希算法。缺省的是MD5于打印有关的option
-text 用文本方式详细打印出该证书的所有细节。
-noout 不打印出请求的编码版本信息。
-modulus 打印出公共密钥的系数值。没研究过RSA就别用这个了。
-serial 打印出证书的系列号。
-hash 把证书的拥有者名称的哈希值给打印出来。
-subject 打印出证书拥有者的名字。
-issuer 打印证书颁发者名字。
4.4 CER/DER-PEM(x509)
由DER格式用户证书servercert.der生成PEM格式用户证书servercert.pem
openssl x509 -inform der -in servercert.der -out servercert.pem
4.5 PEM-P7B(crl2pkcs7)
由PEM格式CA证书cacert.pem和用户证书servercert.pem,生成P7B格式用户证书servercert.p7b。
openssl crl2pkcs7 -nocrl -certfile servercert.pem -certfile cacert.pem -out servercert.p7b
选项:
-inform PEM|DER:输入文件的格式。DER是DER编码的CRL对象。PEM(默认的格式)是base64编码的CRL对象。
-outform PEM|DER:指定文件的输出格式,跟-inform的意思一样。
-in filename:指定CRL文件,不设置此项则从标准输入中获取。
-out filename:指定输出文件,不设置此项则输入到标准输出。
-certfile filename:指定证书文件,PEM格式的证书文件可以包含多个证书,此选项可以多次使用。
-nocrl:不处理crl。一般情况下,输出文件中包含crl信息,设置此选项时,读取时忽略CRL信息,生成的信息不保护CRL信息。
4.6 P7B-PEM(pkcs7)
由P7B格式用户证书servercert.p7b生成PEM格式用户证书servercert.pem
openssl pkcs7 -print_certs -in servercert.p7b -out servercert.pem
选项:
-inform PEM|DER::输入文件格式,DER或者PEM格式。DER格式采用ASN1的DER标准格式。一般用的多的都是PEM格式,就是base64编码格式。
-outform DER|PEM:输出文件格式,DER或者PEM格式。
-in filename:输入的需要处理的文件,默认为标准输入。
-out filename:输出文件,默认为标准输出。
-print:打印出pkcs7的所有信息值。
-print_certs:打印证书或CRL信息,在一行中打印出持有者和颁发者。
-text:打印证书相关信息。
-noout:不打印证书信息值。
-engine id:指定硬件引擎。-engine id:指定硬件引擎。
4.7 P7B-PFX(pkcs7-pkcs12)
先将P7B格式证书转换为PEM格式
openssl pkcs7 -print_certs -in servercert.p7b -out servercert.pem
再将PEM格式证书转换为PFX格式
openssl pkcs12 -export -in servercert.pem -inkey serverkey.pem –certfile cacert.pem -out servercert.pfx
5 扩展知识
5.1 公钥密码标准-PKCS
PKCS全称是 Public-Key Cryptography Standards (公钥密码标准),PKCS是由RSA实验室与其它安全系统开发商为促进公钥密码的发展而制订的一系列标准,其中包括证书申请、证书更新、证书作废表发布、扩展证书内容以及数字签名、数字信封的格式等方面的一系列相关协议。
PKCS标准汇总 |
|||
版本 |
名称 |
简介 |
|
PKCS #1 |
2.1 |
RSA密码编译标准(RSA Cryptography Standard) |
定义了RSA的数理基础、公/私钥格式,以及加/解密、签/验章的流程。1.5版本曾经遭到攻击。 |
PKCS #2 |
- |
撤销 |
原本是用以规范RSA加密摘要的转换方式,现已被纳入PKCS#1之中。 |
PKCS #3 |
1.4 |
DH金钥协议标准(Diffie-Hellman key agreement Standard) |
规范以DH金钥协议为基础的金钥协议标准。其功能,可以让两方透过金议协议,拟定一把会议金钥(Session key)。 |
PKCS #4 |
- |
撤销 |
原本用以规范转换RSA金钥的流程。已被纳入PKCS#1之中。 |
PKCS #5 |
2.0 |
密码基植加密标准(Password-based Encryption Standard) |
参见RFC 2898与PBKDF2。 |
PKCS #6 |
1.5 |
证书扩展语法标准(Extended-Certificate Syntax Standard) |
将原本X.509的证书格式标准加以扩充。 |
PKCS #7 |
1.5 |
密码讯息语法标准(Cryptographic Message Syntax Standard) |
参见RFC 2315。规范了以公开密钥基础设施(PKI)所产生之签章/密文之格式。其目的一样是为了拓展数位证书的应用。其中,包含了S/MIME与CMS。 |
PKCS #8 |
1.2 |
私钥讯息表示标准(Private-Key Information Syntax Standard). |
Apache读取证书私钥的标准。 |
PKCS #9 |
2.0 |
选择属性格式(Selected Attribute Types) |
定义PKCS#6、7、8、10的选择属性格式。 |
PKCS #10 |
1.7 |
证书申请标准(Certification Request Standard) |
参见RFC 2986。规范了向证书中心申请证书之CSR(certificate signing request)的格式。 |
PKCS #11 |
2.20 |
密码装置标准界面(Cryptographic Token Interface (Cryptoki)) |
定义了密码装置的应用程序界面(API)之规格。 |
PKCS #12 |
1.0 |
个人讯息交换标准(Personal Information Exchange Syntax Standard) |
定义了包含私钥与公钥证书(public key certificate)的文件格式。私钥采密码(password)保护。常见的PFX就履行了PKCS#12。 |
PKCS #13 |
– |
椭圆曲线密码学标准(Elliptic curve cryptography Standard) |
制定中。规范以椭圆曲线密码学为基础所发展之密码技术应用。椭圆曲线密码学是新的密码学技术,其强度与效率皆比现行以指数运算为基础之密码学算法来的优秀。然而,该算法的应用尚不普及。 |
PKCS #14 |
– |
拟乱数产生器标准(Pseudo-random Number Generation) |
制定中。规范拟乱数产生器的使用与设计。 |
PKCS #15 |
1.1 |
密码装置讯息格式标准(Cryptographic Token Information Format Standard) |
定义了密码设备内部数据的组织结构。 |
5.2 X.509标准
在密码学中,X.509是由ITU-T为了公开金钥基础建设(PKI)与授权管理基础建设(PMI)提出的产业标准。X.509标准,规范了公开金钥认证、证书吊销列表、授权凭证、凭证路径验证算法等。
X.509被广泛使用的数字证书标准。X.509定义了两种证书:公钥证书和属性证书,PKCS#7和PKCS#12使用的都是公钥证书。
X.509 3 版是最新的版本(1996 年)。它支持扩展的概念,因此任何人均可定义扩展并将其纳入证书中。常用的扩展包括:KeyUsage(仅限密钥用于特殊目的,例如“只签”)和 AlternativeNames(允许其它标识与该公钥关联,例如 DNS 名、电子邮件地址、IP 地址)。扩展可标记为“极重要”,以表示应选中该扩展并强制执行或使用。例如,如果某一证书将 KeyUsage 扩展标记为“极重要”,而且设置为“keyCertSign”,则在 SSL 通信期间该证书出现时将被拒绝,因为该证书扩展表示相关私钥应只用于签写证书,而不应该用于 SSL。
在X.509系统中,CA签发的证书依照X.500的管理,绑定了一个唯一甄别名(DN-Distinguished Name ),可以包含多个字段和值,还可以支持别名(Alternative Name )。
一个组织受信任的根证书会分发给所有需要用到的PKI系统的员工手上。主流浏览器:IE、Netscape/Mozilla,Opera和Safari会预先安装一部分根证书,这些根证书都是受信任的证书认证机构CA,这样他们颁发的证书,浏览器将可以直接信任。虽然用户可以删除或者禁用这些根证书,但事实上,用户很少这么做。在最新的微软平台,甚至会在用户移除了预先安置的根证书后,当用户再访问这些被删除的根证书网站的时候,会自动将这些根证书恢复到信任列表中。
X.509包含了一个证书吊销列表(CRL-Certificate Revocation List)实施的标准,这在PKI系统中经常被人所忽略。IETF提出的检查证书有效性的方法是在线证书状态(OCSP- Online Certificate Status Protocol)。
X.509 v3证书数据结构如下:
Certificate证书
Version 版本
Serial Number序列号
Algorithm ID 算法标识
Issuer 颁发者
Validity 有效期
Not Before 有效起始日期
Not After 有效终止日期
Subject 使用者
Subject Public Key Info 使用者公钥信息
Public Key Algorithm公钥算法
Subject Public Key公钥
Issuer Unique Identifier (Optional) 颁发者唯一标识
Subject Unique Identifier (Optional) 使用者唯一标识
Extensions (Optional) 扩展
……
Certificate Signature Algorithm 证书签名算法
Certificate Signature 证书签名
5.3 证书格式
5.3.1 PKCS#7
PKCS#7 是一种将数据加密和签名(正式名称是“enveloping”)的技术标准。它描述数字证书的语法和其他加密消息,尤其是数据加密和数字签名的方法,也包含了算法。
格式 |
PKCS7 |
扩展名 |
p7b/.p7r |
描述 |
加密信息语法标准 |
特点 |
1、p7b以树状展示证书链,仅包含证书和CRL列表信息,不含私钥 2、p7r为CA对证书请求签名的回复,只能用于导入 |
5.3.2 PKCS#10
格式 |
PKCS10 |
扩展名 |
.p10/.csr |
描述 |
Certificate Signing Request |
特点 |
1、 ASCII文件 2、证书签名请求文件 3、CA签名后以p7r文件回复 |
5.3.3 PKCS#12
PKCS#12文件, 包含证书(公钥)和私钥(受密码保护),也可包含整个证书链。PKCS#12文件可以存放多个证书,通常用于WINDOWS IIS,也能够被当作Java Keysotre文件使用,用于Tomcat,Resign,Weblogic,Jboss等,不能被用于Apache。
在微软的CA用户证书申请模版中,没有提示用户自己创建RSA密钥对,因此用户一般会使用CA系统提供的RSA密钥对生成CSR(证书请求)文件,然后直接颁发cer证书。这也就导致了用户手中没有生成该证书的RSA私钥,从而无法形成含有私钥的p12证书。
格式 |
PKCS12 |
扩展名 |
.p12/.pfx |
描述 |
个人信息交换语法标准 |
特点 |
1、包含私钥、公钥及其证书 2、密钥库和私钥用相同密码进行保护 |
5.3.4 PEM
格式 |
PEM |
扩展名 |
.pem/.cer/.crt |
描述 |
Printable Encoded Message |
特点 |
1、 该编码格式在RFC1421中定义,其实PEM是【Privacy-Enhanced Mail】的简写,但他也同样广泛运用于密钥管理 2、 ASCII文件 3、 一般基于base 64编码 4、Apache用到的CA证书链就是PEM格式,它实际上可保存普通多个X509证书(.cer), 将每个证书简单加在一起就可以了 |
5.3.5 DER
格式 |
DER |
扩展名 |
.cer/.crt/.rsa |
描述 |
用于存放证书 |
特点 |
二进制,不含私钥 |
5.3.6 CMS
格式 |
CMS |
扩展名 |
.p7c/.p7m/.p7s |
描述 |
Cryptographic Message Syntax |
特点 |
1、 p7c只保存证书 2、p7m:signature with enveloped data 3、p7s:时间戳签名文件 |
5.3.7 SPC
格式 |
SPC |
扩展名 |
pvk/.spc |
描述 |
Software Publishing Certificate |
特点 |
微软公司特有的双证书文件格式,经常用于代码签名,其中 1、pvk用于保存私钥 2、spc用于保存公钥 |