﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-flyonok-随笔分类-openssl</title><link>http://www.cppblog.com/flyonok/category/15315.html</link><description /><language>zh-cn</language><lastBuildDate>Wed, 17 Nov 2010 11:47:13 GMT</lastBuildDate><pubDate>Wed, 17 Nov 2010 11:47:13 GMT</pubDate><ttl>60</ttl><item><title>open addressing--hash table</title><link>http://www.cppblog.com/flyonok/archive/2010/11/17/133880.html</link><dc:creator>flyonok</dc:creator><author>flyonok</author><pubDate>Wed, 17 Nov 2010 06:03:00 GMT</pubDate><guid>http://www.cppblog.com/flyonok/archive/2010/11/17/133880.html</guid><wfw:comment>http://www.cppblog.com/flyonok/comments/133880.html</wfw:comment><comments>http://www.cppblog.com/flyonok/archive/2010/11/17/133880.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/flyonok/comments/commentRss/133880.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/flyonok/services/trackbacks/133880.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Open Addressing文章分类:Java编程1 Overview&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Open addressing和Chaining是两种不同的解决hash冲突的策略。当多个不同的key被映射到相同的slot时，chaining方式采用链表保存所有的value。而Open addressing则尝试在该slot的邻近位置查找，直到找到对应的valu...&nbsp;&nbsp;<a href='http://www.cppblog.com/flyonok/archive/2010/11/17/133880.html'>阅读全文</a><img src ="http://www.cppblog.com/flyonok/aggbug/133880.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/flyonok/" target="_blank">flyonok</a> 2010-11-17 14:03 <a href="http://www.cppblog.com/flyonok/archive/2010/11/17/133880.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转--PKCS标准</title><link>http://www.cppblog.com/flyonok/archive/2010/11/15/133660.html</link><dc:creator>flyonok</dc:creator><author>flyonok</author><pubDate>Mon, 15 Nov 2010 07:11:00 GMT</pubDate><guid>http://www.cppblog.com/flyonok/archive/2010/11/15/133660.html</guid><wfw:comment>http://www.cppblog.com/flyonok/comments/133660.html</wfw:comment><comments>http://www.cppblog.com/flyonok/archive/2010/11/15/133660.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/flyonok/comments/commentRss/133660.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/flyonok/services/trackbacks/133660.html</trackback:ping><description><![CDATA[<p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; font-family: verdana, sans-serif; font-size: 14px; line-height: 21px; "><span class="fa" style="line-height: 21px; ">摘自</span>《公钥基础设施PKI及其应用》第11章</p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; font-family: verdana, sans-serif; font-size: 14px; line-height: 21px; "><strong>11.3&nbsp; PKCS标准</strong></p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; font-family: verdana, sans-serif; font-size: 14px; line-height: 21px; ">公钥密码标准（PKCS）最初是为推进公钥密码系统的互操作性，由RSA实验室与工业界、学术界和政府代表合作开发的。在RSA带领下，PKCS的 研究随着时间不断发展，它涉及了不断发展的PKI格式标准、算法和应用程序接口。PKCS标准提供了基本的数据格式定义和算法定义，它们实际是今天所有 PKI实现的基础。</p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; font-family: verdana, sans-serif; font-size: 14px; line-height: 21px; "><strong>11.3.1&nbsp; PKCS标准的内容</strong></p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; font-family: verdana, sans-serif; font-size: 14px; line-height: 21px; "><strong>PKCS标准如下：</strong></p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; font-family: verdana, sans-serif; font-size: 14px; line-height: 21px; ">（1）PKCS#1：RSA加密标准。PKCS#1定义了RSA公钥函数的基本格式标准，特别是数字签名。它定义了数字签名如何计算，包括待签名数据和签名本身的格式；它也定义了PSA公/私钥的语法。</p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; font-family: verdana, sans-serif; font-size: 14px; line-height: 21px; ">（2）PKCS#2：涉及了RSA的消息摘要加密，这已被并入PKCS#1中。</p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; font-family: verdana, sans-serif; font-size: 14px; line-height: 21px; ">（3）PKCS#3：Diffie-Hellman密钥协议标准。PKCS#3描述了一种实现Diffie- Hellman密钥协议的方法。</p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; font-family: verdana, sans-serif; font-size: 14px; line-height: 21px; ">（4）PKCS#4：最初是规定RSA密钥语法的，现已经被包含进PKCS#1中。</p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; font-family: verdana, sans-serif; font-size: 14px; line-height: 21px; ">（5）PKCS#5：基于口令的加密标准。PKCS#5描述了使用由口令生成的密钥来加密8位位组串并产生一个加密的8位位组串的方法。PKCS#5可以用于加密私钥，以便于密钥的安全传输（这在PKCS#8中描述）。</p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; font-family: verdana, sans-serif; font-size: 14px; line-height: 21px; ">（6）PKCS#6：扩展证书语法标准。PKCS#6定义了提供附加实体信息的X.509证书属性扩展的语法（当PKCS#6第一次发布时，X.509还不支持扩展。这些扩展因此被包括在X.509中）。</p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; font-family: verdana, sans-serif; font-size: 14px; line-height: 21px; ">（7）PKCS#7：密码消息语法标准。PKCS#7为使用密码算法的数据规定了通用语法，比如数字签名和数字信封。PKCS#7提供了许多格式选项，包括未加密或签名的格式化消息、已封装（加密）消息、已签名消息和既经过签名又经过加密的消息。</p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; font-family: verdana, sans-serif; font-size: 14px; line-height: 21px; ">（8）PKCS#8：私钥信息语法标准。PKCS#8定义了私钥信息语法和加密私钥语法，其中私钥加密使用了PKCS#5标准。</p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; font-family: verdana, sans-serif; font-size: 14px; line-height: 21px; ">（9）PKCS#9：可选属性类型。PKCS#9定义了PKCS#6扩展证书、PKCS#7数字签名消息、PKCS#8私钥信息和PKCS#10证 书签名请求中要用到的可选属性类型。已定义的证书属性包括E-mail地址、无格式姓名、内容类型、消息摘要、签名时间、签名副本（counter signature）、质询口令字和扩展证书属性。</p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; font-family: verdana, sans-serif; font-size: 14px; line-height: 21px; ">（10）PKCS#10：证书请求语法标准。PKCS#10定义了证书请求的语法。证书请求包含了一个唯一识别名、公钥和可选的一组属性，它们一起被请求证书的实体签名（证书管理协议中的PKIX证书请求消息就是一个PKCS#10）。</p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; font-family: verdana, sans-serif; font-size: 14px; line-height: 21px; ">（11）PKCS#11：密码令牌接口标准。PKCS#11或&#8220;Cryptoki&#8221;为拥有密码信息（如加密密钥和证书）和执行密码学函数的单用户设 备定义了一个应用程序接口（API）。智能卡就是实现Cryptoki的典型设备。注意：Cryptoki定义了密码函数接口，但并未指明设备具体如何实 现这些函数。而且Cryptoki只说明了密码接口，并未定义对设备来说可能有用的其他接口，如访问设备的文件系统接口。</p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; font-family: verdana, sans-serif; font-size: 14px; line-height: 21px; ">（12）PKCS#12：个人信息交换语法标准。PKCS#12定义了个人身份信息（包括私钥、证书、各种秘密和扩展字段）的格式。PKCS#12有助于传输证书及对应的私钥，于是用户可以在不同设备间移动他们的个人身份信息。</p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; font-family: verdana, sans-serif; font-size: 14px; line-height: 21px; ">（13）PDCS#13：椭圆曲线密码标准。PKCS#13标准当前正在完善之中。它包括椭圆曲线参数的生成和验证、密钥生成和验证、数字签名和公钥加密，还有密钥协定，以及参数、密钥和方案标识的ASN.1语法。</p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; font-family: verdana, sans-serif; font-size: 14px; line-height: 21px; ">（14）PKCS#14：伪随机数产生标准。PKCS#14标准当前正在完善之中。为什么随机数生成也需要建立自己的标准呢？PKI中用到的许多基 本的密码学函数，如密钥生成和Diffie-Hellman共享密钥协商，都需要使用随机数。然而，如果&#8220;随机数&#8221;不是随机的，而是取自一个可预测的取值 集合，那么密码学函数就不再是绝对安全了，因为它的取值被限于一个缩小了的值域中。因此，安全伪随机数的生成对于PKI的安全极为关键。</p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; font-family: verdana, sans-serif; font-size: 14px; line-height: 21px; ">（15）PKCS#15：密码令牌信息语法标准。PKCS#15通过定义令牌上存储的密码对象的通用格式来增进密码令牌的互操作性。在实现 PKCS#15的设备上存储的数据对于使用该设备的所有应用程序来说都是一样的，尽管实际上在内部实现时可能所用的格式不同。PKCS#15的实现扮演了 翻译家的角色，它在卡的内部格式与应用程序支持的数据格式间进行转换。</p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; font-family: verdana, sans-serif; font-size: 14px; line-height: 21px; "><strong>11.3.2&nbsp; PKCS主要用途</strong></p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; font-family: verdana, sans-serif; font-size: 14px; line-height: 21px; ">以上标准主要用于用户实体通过RA的证书申请、用户的证书更新过程。当证书作废时，RA通过CA向目录服务器中发布证书撤销列表CRL，用于扩展证书内容，以及数字签名与验签过程和实现数字信封格式定义等一系列相关协议。</p><div><br></div>
<img src ="http://www.cppblog.com/flyonok/aggbug/133660.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/flyonok/" target="_blank">flyonok</a> 2010-11-15 15:11 <a href="http://www.cppblog.com/flyonok/archive/2010/11/15/133660.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Win32平台下OpenSSL编写SSL,TLS程序</title><link>http://www.cppblog.com/flyonok/archive/2010/11/09/133100.html</link><dc:creator>flyonok</dc:creator><author>flyonok</author><pubDate>Tue, 09 Nov 2010 05:49:00 GMT</pubDate><guid>http://www.cppblog.com/flyonok/archive/2010/11/09/133100.html</guid><wfw:comment>http://www.cppblog.com/flyonok/comments/133100.html</wfw:comment><comments>http://www.cppblog.com/flyonok/archive/2010/11/09/133100.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/flyonok/comments/commentRss/133100.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/flyonok/services/trackbacks/133100.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/flyonok/archive/2010/11/09/133100.html'>阅读全文</a><img src ="http://www.cppblog.com/flyonok/aggbug/133100.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/flyonok/" target="_blank">flyonok</a> 2010-11-09 13:49 <a href="http://www.cppblog.com/flyonok/archive/2010/11/09/133100.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>利用openssl创建一个简单的CA</title><link>http://www.cppblog.com/flyonok/archive/2010/10/30/131840.html</link><dc:creator>flyonok</dc:creator><author>flyonok</author><pubDate>Sat, 30 Oct 2010 05:58:00 GMT</pubDate><guid>http://www.cppblog.com/flyonok/archive/2010/10/30/131840.html</guid><wfw:comment>http://www.cppblog.com/flyonok/comments/131840.html</wfw:comment><comments>http://www.cppblog.com/flyonok/archive/2010/10/30/131840.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/flyonok/comments/commentRss/131840.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/flyonok/services/trackbacks/131840.html</trackback:ping><description><![CDATA[<span class=Apple-style-span style="WORD-SPACING: 0px; FONT: medium Simsun; TEXT-TRANSFORM: none; COLOR: rgb(0,0,0); TEXT-INDENT: 0px; WHITE-SPACE: normal; LETTER-SPACING: normal; BORDER-COLLAPSE: separate; orphans: 2; widows: 2; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><span class=Apple-style-span style="FONT-SIZE: 14px; LINE-HEIGHT: 21px; FONT-FAMILY: verdana, sans-serif; TEXT-ALIGN: left">本文旨在利用开源openssl软件，在Linux（或UNIX/Cygwin）下创建一个简单的CA。我们可以利用这个CA进行PKI、数字证书相关的测试。比如，在测试用Tomcat或Apache构建HTTPS双向认证时，我们可以利用自己建立的测试CA来为服务器端颁发服务器数字证书，为客户端（浏览器）生成文件形式的数字证书（可以同时利用openssl生成客户端私钥）。<br>&nbsp;<br>&nbsp;该简单的CA将建立在用户自己的目录下（$HOME/testca），无需超级用户（root）权限。<br>&nbsp;<br><strong><font size=4>一. 创建CA</font></strong><br><strong>1. 创建CA需要用到的目录和文件：<br></strong>执行命令如下：<br>mkdir "$HOME/testca"<br>cd "$HOME/testca"<br>mkdir newcerts private conf<br>chmod g-rwx,o-rwx private<br>echo "01" &gt; serial<br>touch index.txt<br>&nbsp;<br>说明：<br>$HOME/testca为待建CA的主目录。其中newcerts子目录将存放CA签署（颁发）过的数字证书（证书备份目录）。而private目录用于存放CA的私钥。目录conf只是用于存放一些简化参数用的配置文件。<br>&nbsp;<br>文件serial和index.txt分别用于存放下一个证书的序列号和证书信息数据库。<br>当然，偷懒起见，可以只用按照本文操作即可，不一定需要关心各个目录和文件的作用。<br>&nbsp;<br><strong>2. 生成CA的私钥和自签名证书（即根证书）</strong><br>创建文件：<br>vi "$HOME/testca/conf/gentestca.conf"<br>文件内容如下：<br>####################################<br>[ req ]<br>default_keyfile = $ENV::HOME/testca/private/cakey.pem<br>default_md = md5<br>prompt = no<br>distinguished_name = ca_distinguished_name<br>x509_extensions = ca_extensions<br>&nbsp;<br>[ ca_distinguished_name ]<br>organizationName = TestOrg<br>organizationalUnitName&nbsp; = TestDepartment<br>commonName = TestCA<br>emailAddress =<span class=Apple-converted-space>&nbsp;</span><a style="COLOR: rgb(51,102,153); TEXT-DECORATION: none" href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#102;&#108;&#121;&#111;&#110;&#111;&#107;&#64;&#49;&#54;&#51;&#46;&#99;&#111;&#109;">flyonok@163.com</a><br>&nbsp;<br>[ ca_extensions ]<br>basicConstraints = CA:true<br>########################################<br>&nbsp;<br>然后执行命令如下：<br>cd "$HOME/testca"<br>openssl req -x509 -newkey rsa:2048 -out cacert.pem -outform PEM -days 2190 -config "$HOME/testca/conf/gentestca.conf"<br>执行过程中需要输入CA私钥的保护密码，假设我们输入密码：&nbsp;123456&nbsp;<br>可以用如下命令查看一下CA自己证书的内容<br>openssl x509 -in cacert.pem -text -noout<br>&nbsp;<br><strong>3. 创建一个配置文件，以便后续CA日常操作中使用：</strong><br>vi "$HOME/testca/conf/testca.conf"<br>文件内容如下：<br>####################################<br>[ ca ]<br>default_ca&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = testca&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # The default ca section<br>&nbsp;<br>[ testca ]<br>dir&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = $ENV::HOME/testca&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # top dir<br>database&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = $dir/index.txt&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # index file.<br>new_certs_dir&nbsp; = $dir/newcerts&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # new certs dir<br>&nbsp;<br>certificate&nbsp;&nbsp;&nbsp; = $dir/cacert.pem&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # The CA cert<br>serial&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = $dir/serial&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # serial no file<br>private_key&nbsp;&nbsp;&nbsp; = $dir/private/cakey.pem&nbsp; # CA private key<br>RANDFILE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = $dir/private/.rand&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # random number file<br>&nbsp;<br>default_days&nbsp;&nbsp; = 365&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # how long to certify for<br>default_crl_days= 30&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # how long before next CRL<br>default_md&nbsp;&nbsp;&nbsp;&nbsp; = md5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # message digest method to use<br>unique_subject = no&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # Set to 'no' to allow creation of<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # several ctificates with same subject.<br>policy&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = policy_any&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # default policy<br>&nbsp;<br>[ policy_any ]<br>countryName&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = optional<br>stateOrProvinceName&nbsp;&nbsp;&nbsp;&nbsp; = optional<br>localityName&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = optional<br>organizationName&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = optional<br>organizationalUnitName&nbsp; = optional<br>commonName&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = supplied<br>emailAddress&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = optional<br>&nbsp;<br>########################################<br>&nbsp;<br>&nbsp;<br><strong><font size=4>二. CA的日常操作</font></strong><br><strong>1. 根据证书申请请求签发证书</strong><br>假设收到一个证书请求文件名为req.pem，文件格式应该是PKCS#10格式（标准证书请求格式）。<br>&nbsp;<br>首先可以查看一下证书请求的内容，执行命令：<br>openssl req -in req.pem -text -noout<br>将看到证书请求的内容，包括请求者唯一的名字（DN）、公钥信息（可能还有一组扩展的可选属性）。<br>&nbsp;<br>执行签发命令：<br>openssl ca -in req.pem -out cert.pem -config "$HOME/testca/conf/testca.conf"<br>执行过程中会要求输入访问CA的私钥密码（刚才设置的123456）。<br>&nbsp;<br>完成上一步后，签发好的证书就是cert.pem，另外$HOME/testca/newcerts里也会有一个相同的证书副本（文件名为证书序列号）。<br>你可以执行以下语句来查看生成的证书的内容：<br>openssl x509 -in cert.pem -text -noout<br>&nbsp;<br><strong>2. 吊销证书（作废证书）</strong><br>一般由于用户私钥泄露等情况才需要吊销一个未过期的证书。（当然我们用本测试CA时其时很少用到该命令，除非专门用于测试吊销证书的情况）<br>假设需要被吊销的证书文件为cert.pem，则执行以下命令吊销证书：<br>openssl ca -revoke cert.pem -config "$HOME/testca/conf/testca.conf"<br>&nbsp;<br><strong>3. 生成证书吊销列表文件（CRL）</strong><br>准备公开被吊销的证书列表时，可以生成证书吊销列表（CRL），执行命令如下：<br>openssl ca -gencrl -out testca.crl -config "$HOME/testca/conf/testca.conf"<br>还可以添加-crldays和-crlhours参数来说明下一个吊销列表将在多少天后（或多少小时候）发布。<br>&nbsp;<br>可以用以下命令检查testca.crl的内容：<br>openssl crl -in testca.crl -text -noout<br>&nbsp;<br><strong><font size=4>三. 自己生成公钥密钥，并用测试CA签发数字证书</font></strong><br>我们在平时测试时，可以自己用openssl为服务器或用户生成公钥密钥，并用上面创建的CA签发对应私钥（密钥）的数字证书。<br>假设，我们就用刚才创建CA的操作系统用户为名为testuser的用户创建数字证书，我们要把待创建的私钥、证书等都放在目录$HOME/testuser下：<br>&nbsp;<br><strong>1. 创建密钥和证书请求（证书请求里包含了公钥）</strong><br>创建$HOME/testuser目录并执行命令：<br>mkdir $HOME/testuser<br>cd $HOME/testuser<br>openssl req -newkey rsa:1024 -keyout testkey.pem -keyform PEM -out testreq.pem -outform PEM -subj "/O=TestCom/OU=TestOU/CN=testuser"<span class=Apple-converted-space>&nbsp;</span><br>执行过程中需要输入私钥的保护密码，假设我们输入密码： 222222<br>&nbsp;<br>执行完后，testkey.pem即为用户的密钥，而testreq.pem即为证书请求。<br>可以用openssl req -in testreq.pem -text -noout查看证书请求的内容。<br>&nbsp;<br><strong>2. 用测试CA为testuser签发证书</strong><br>同样还在$HOME/testuser目录下执行命令：<br>openssl ca -in testreq.pem -out testcert.pem -config "$HOME/testca/conf/testca.conf"<br>执行过程中需要输入CA的密钥保护密码（刚才设置的888888），并且最后询问你是否要给该用户签发证书时要选y。<br>&nbsp;<br>执行完后，testcert.pem即为证书，<br>可以用命令openssl x509 -in testcert.pem -text -noout查看证书内容。<br>&nbsp;<br><strong>3. 制作一个PKCS12格式的文档（个人数字证书）<br></strong>我们制作的这个PKCS#12文件将包含密钥、证书和颁发该证书的CA证书。该文件可以直接用于服务器数字证书或个人数字证书。<br>把前几步生成的密钥和证书制作成一个pkcs12文件的方法执行命令：<br>openssl pkcs12 -export -in testcert.pem -inkey testkey.pem -out testuser.p12 -name testuser -chain -CAfile "$HOME/testca/cacert.pem"<br>执行过程中需要输入保护密钥的密码（222222），以及新的保护pkcs12文件的密码。<br>&nbsp;<br>执行完后，testuser.p12即为pkcs12文件。你可以直接拷贝到windows下，作为个人数字证书，双击导入IE后就可以使用了。该文件也可以直接用于tomcat作为服务器证书使用（我尽量在近期再写一篇关于如何自己用tomcat建立HTTPS双向认证测试环境的文章）。<br>&nbsp;<br>若要查看testuser.p12的内容可以用命令openssl pkcs12 -in testuser.p12<br>&nbsp;<br>说明：<br>&nbsp;&nbsp;&nbsp; - 本文中名词&#8220;个人数字证书&#8221;意识为包含私钥和证书的实体，而不是单指只保护公钥的数字证书。<br>&nbsp;&nbsp;&nbsp; -&nbsp; openssl版本OpenSSL 0.9.8g 19</span></span>
<img src ="http://www.cppblog.com/flyonok/aggbug/131840.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/flyonok/" target="_blank">flyonok</a> 2010-10-30 13:58 <a href="http://www.cppblog.com/flyonok/archive/2010/10/30/131840.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>