<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>秋天的博客</title>
	<atom:link href="http://www.fallday.org/feed" rel="self" type="application/rss+xml" />
	<link>http://www.fallday.org</link>
	<description>互联网/虚拟主机/VPS/云计算经验点滴</description>
	<lastBuildDate>Fri, 18 Jun 2010 16:20:02 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>SLES 10 Apache升级</title>
		<link>http://www.fallday.org/archives/549</link>
		<comments>http://www.fallday.org/archives/549#comments</comments>
		<pubDate>Fri, 18 Jun 2010 16:20:02 +0000</pubDate>
		<dc:creator>fallday</dc:creator>
				<category><![CDATA[Web服务]]></category>
		<category><![CDATA[网站开发]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[SLES]]></category>

		<guid isPermaLink="false">http://www.fallday.org/?p=549</guid>
		<description><![CDATA[SLES 10自带的Apache版本是2.2.3，有点老了。即使用打了SP3也并不会升级到Apache的更高版本。目前Apache已经到了2.2.15，如果你希望使用一些新版本的特性。怎么升级呢？
从Apache的网站上下级源代码自己编译是一种办法，但对许多人并不方便，RPM包也许是更好的选择。哪里去找呢？
有一个好地方，OpenSUSE的Build Service, http://software.opensuse.org/search，可以很方便的搜索RPM包。比如搜索Apache2，马上可以得到你想要的。
Apache的2.2.15的版本要求OpenSSL的更高版本，2.2.14也会要求libapr1及libapr-util1的更高版本，不过这些也同样可以在OpenSUSE上找到。
]]></description>
			<content:encoded><![CDATA[<p>SLES 10自带的Apache版本是2.2.3，有点老了。即使用打了SP3也并不会升级到Apache的更高版本。目前Apache已经到了2.2.15，如果你希望使用一些新版本的特性。怎么升级呢？</p>
<p><span id="more-549"></span>从Apache的网站上下级源代码自己编译是一种办法，但对许多人并不方便，RPM包也许是更好的选择。哪里去找呢？</p>
<p>有一个好地方，OpenSUSE的Build Service, http://software.opensuse.org/search，可以很方便的搜索RPM包。比如搜索Apache2，马上可以得到你想要的。</p>
<p>Apache的2.2.15的版本要求OpenSSL的更高版本，2.2.14也会要求libapr1及libapr-util1的更高版本，不过这些也同样可以在OpenSUSE上找到。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fallday.org/archives/549/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>通过SSH tunnel访问内网的VMWare Esxi 4</title>
		<link>http://www.fallday.org/archives/547</link>
		<comments>http://www.fallday.org/archives/547#comments</comments>
		<pubDate>Fri, 11 Jun 2010 14:37:20 +0000</pubDate>
		<dc:creator>fallday</dc:creator>
				<category><![CDATA[主机管理]]></category>
		<category><![CDATA[ssh tunnel]]></category>
		<category><![CDATA[VMWare ESXi]]></category>

		<guid isPermaLink="false">http://www.fallday.org/?p=547</guid>
		<description><![CDATA[需要远程管理在数据中心的VMWare Esxi 4服务器，无法直接访问这台机器，只能通过一台位于DMZ的Linux服务器中转。首先想到的是SSH Tunnel, 映射远程端口到本机端口，这样访问本机(localhost)服务也就是访问远程服务器对应服务了。这个方法对管理数据中心的远程服务器很有效。
ESXi 4使用443及903端口，SSH Tunnel这两个端口后发现还不能用本地的VMWare VSphere Client连接上。再究下去，发现需要本地能解析Esxi的机器的主机名，当然用SSH tunnel要解析到127.0.0.1. 在本地localhost设置解析后。再用VMWare VSphere Client访问，成功！注意，连接时要用主机名，不能用localhost或者127.0.0.1
]]></description>
			<content:encoded><![CDATA[<p>需要远程管理在数据中心的VMWare Esxi 4服务器，无法直接访问这台机器，只能通过一台位于DMZ的Linux服务器中转。首先想到的是SSH Tunnel, 映射远程端口到本机端口，这样访问本机(localhost)服务也就是访问远程服务器对应服务了。这个方法对管理数据中心的远程服务器很有效。</p>
<p><span id="more-547"></span>ESXi 4使用443及903端口，SSH Tunnel这两个端口后发现还不能用本地的VMWare VSphere Client连接上。再究下去，发现需要本地能解析Esxi的机器的主机名，当然用SSH tunnel要解析到127.0.0.1. 在本地localhost设置解析后。再用VMWare VSphere Client访问，成功！注意，连接时要用主机名，不能用localhost或者127.0.0.1</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fallday.org/archives/547/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Struts 2集成Dojo性能优化</title>
		<link>http://www.fallday.org/archives/543</link>
		<comments>http://www.fallday.org/archives/543#comments</comments>
		<pubDate>Thu, 10 Jun 2010 14:05:32 +0000</pubDate>
		<dc:creator>fallday</dc:creator>
				<category><![CDATA[Web服务]]></category>
		<category><![CDATA[网站开发]]></category>
		<category><![CDATA[Dojo]]></category>
		<category><![CDATA[Struts]]></category>

		<guid isPermaLink="false">http://www.fallday.org/?p=543</guid>
		<description><![CDATA[最近部署一个应用，上线后感觉页面访问比较慢。检查发现每个页面都要重复下载一些Dojo的JS，而且被设置不被浏览器缓存。检查发现应用是用的Struts 2集成的Dojo, Dojo文件是由struts filter动态从struts-core中加载。考虑之后决定把struts中的Dojo这样的静态资源都提取出来于Web服务器直接提供，并且设置压缩传输及Cache策略。一切完成之后，世界又变的很美好。
Instructions for improving the performance of dojo 0.4.2 in Struts 2.0.9:
&#62;
&#62; $resources$ is assumed to be your web resources directory
&#62;
&#62; 1. First, configure struts to serve the static files directly from
&#62; $resources$/struts instead of from within struts-core-2.0.9.jar:
&#62;    a. extract struts2-core-2.0.9.jar/org/apache/struts2/static/* to
&#62; $resources$/struts/
&#62;   b. edit struts.properties and set struts.serve.static=false
&#62;   c. [...]]]></description>
			<content:encoded><![CDATA[<p>最近部署一个应用，上线后感觉页面访问比较慢。检查发现每个页面都要重复下载一些Dojo的JS，而且被设置不被浏览器缓存。检查发现应用是用的Struts 2集成的Dojo, Dojo文件是由struts filter动态从struts-core中加载。考虑之后决定把struts中的Dojo这样的静态资源都提取出来于Web服务器直接提供，并且设置压缩传输及Cache策略。一切完成之后，世界又变的很美好。</p>
<p><span id="more-543"></span>Instructions for improving the performance of dojo 0.4.2 in Struts 2.0.9:<br />
&gt;<br />
&gt; $resources$ is assumed to be your web resources directory<br />
&gt;<br />
&gt; 1. First, configure struts to serve the static files directly from<br />
&gt; $resources$/struts instead of from within struts-core-2.0.9.jar:<br />
&gt;    a. extract struts2-core-2.0.9.jar/org/apache/struts2/static/* to<br />
&gt; $resources$/struts/<br />
&gt;   b. edit struts.properties and set struts.serve.static=false<br />
&gt;   c. also extract the javascript and css files from<br />
&gt; struts2-core-2.0.9.jar/templates/* to $resources$/struts/ as this will<br />
&gt; be helpful later<br />
&gt;       eg. $resources$/struts/ajax/dojoRequire.js<br />
&gt;<br />
&gt; Confirm that your application still works before proceeding. It&#8217;s<br />
&gt; essential that resources are loaded from the directory rather than the jar.<br />
&gt;<br />
&gt; 2. Download the source of dojo 0.4.2. You won&#8217;t need to modify it. The<br />
&gt; download location doesn&#8217;t matter. We assume it&#8217;s in release-0.4.2/<br />
&gt;<br />
&gt;  &gt; svn export http://svn.dojotoolkit.org/dojo/tags/release-0.4.2<br />
&gt;<br />
&gt; This is almost identical to the version bundled with struts2.0.9.<br />
&gt;<br />
&gt; 3. Use an editor to create a dojo custom profile as the file<br />
&gt; release-0.4.2/buildscripts/profiles/struts2.profile.js. This file<br />
&gt; defines which dojo resources you use directly. Essentially it specifies<br />
&gt; which code will be included in dojo.js. An example that includes almost<br />
&gt; everything is provided at the end of this email.<br />
&gt;<br />
&gt; 4. Copy the struts widgets into the dojo directory so they can be<br />
&gt; included within dojo.js. That is, copy $resources$/struts/dojo/struts/*<br />
&gt; to release-0.4.2/struts.<br />
&gt; This is the directory that contains the widget and widgets<br />
&gt; subdirectories, css and some images.<br />
&gt;<br />
&gt; 5. Build dojo using ant. This will create a new dojo.js file:<br />
&gt;<br />
&gt; &gt; cd release-0.4.2/buildscripts<br />
&gt; &gt; ant -Dprofile=struts2 -Dstrip_and_compress=true clean release<br />
&gt; intern-strings strip-resource-comments<br />
&gt;<br />
&gt; (You may be asked to run it twice).<br />
&gt;<br />
&gt; Pay some attention to the build process. In particular, note whether it<br />
&gt; finds the struts widgets and &#8216;internalises&#8217; the related resources. If<br />
&gt; not, see Step 4. You&#8217;ll probably notice a lot of things are included<br />
&gt; that you don&#8217;t need. That will be helpful later for optimizations.<br />
&gt; Some errors will occur while stripping the comments but these are ok.<br />
&gt;<br />
&gt; 6. When the build process completes the release directory will contain<br />
&gt; all the files you need. The content of the release directory can be<br />
&gt; copied over the top of $resources$/struts/dojo. You&#8217;ll notice it&#8217;s<br />
&gt; almost exactly the same as the original, although dojo.js is probably<br />
&gt; larger.<br />
&gt;<br />
&gt; It&#8217;s okay to delete the demo, test and release subfolders before copying<br />
&gt; to your application. The src subfolder must be distributed with your<br />
&gt; application as it contains images used by dojo.<br />
&gt;<br />
&gt; 7. Clear your browser cache and test your application again. You should<br />
&gt; note the larger dojo.js file being loaded and significantly fewer<br />
&gt; requests for resources by dojo  Hopefully it&#8217;s also a lot faster.<br />
&gt;<br />
&gt; That&#8217;s it. Now you can go back and optimize the profile by removing<br />
&gt; resources you don&#8217;t need. There&#8217;s examples in the profiles directory.<br />
&gt; Repeat the build/test process to find the right balance.<br />
&gt; I also recommend editing $resources$/struts/ajax/dojoRequire.js to<br />
&gt; remove the reference to the Editor2 if you don&#8217;t use this as it&#8217;s a<br />
&gt; very,very heavy-weight resource.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fallday.org/archives/543/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WebSphere Web Server配置方式选择</title>
		<link>http://www.fallday.org/archives/541</link>
		<comments>http://www.fallday.org/archives/541#comments</comments>
		<pubDate>Sun, 06 Jun 2010 06:55:55 +0000</pubDate>
		<dc:creator>fallday</dc:creator>
				<category><![CDATA[Web服务]]></category>
		<category><![CDATA[网站开发]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[mod_proxy]]></category>
		<category><![CDATA[WebSphere]]></category>
		<category><![CDATA[反向代理]]></category>

		<guid isPermaLink="false">http://www.fallday.org/?p=541</guid>
		<description><![CDATA[在生产环境中，应用服务器往往不会直接暴露在公网上，而是通过前置的Web服务器来提供访问。比如通过反向代理(Apache mod_proxy)。WebSphere应用服务器(WAS)还提供了一个plugin来提供Web服务器的WebSphere连接。可以根据自己的需要来选择。
反向代理是一种简单能用的方式，但mod_proxy的ProxyPassReverse只能处理HTTP Header中的地址变换，如果后端的应用有网页内容动态生成URL的情况，有些mod_proxy+mod_http_proxy就不能完全处理，需要一些其它的module来协助处理。WebSphere Plugin这种情况下的表现会更好些。但也不是所有的情况都会正确。有些mod_proxy没问题的地方反而WebSphere plugin需要一些额外处理。比如Plugin没有提供ProxyPassReverse那样的处理。如果redirect的端口(比如9080)不是apache的默认端口(80)。这时可能需要在Apache下也提供额外端口的监听。这样请示才能被送到WebSphere Plugin中被处理。
WebSpehre Plugin还提供一此额外的优点：
1. 可以被WebSphere Application Server统一管理，自动完成部署应用的配置
2. 提供负载平衡(Load balance)及Failover的能力，满足WebSphere集群配置
(Apache mod_proxy可以考虑mod_proxy_balancer)
3. 提供应用静态资源分享的能力及工具。
(Apache mod_proxy需要时可以来手工处理, ProxyPass path !可以设置不需要代理的url资源，这引起资源可以由apache处理。)
]]></description>
			<content:encoded><![CDATA[<p>在生产环境中，应用服务器往往不会直接暴露在公网上，而是通过前置的Web服务器来提供访问。比如通过反向代理(Apache mod_proxy)。WebSphere应用服务器(WAS)还提供了一个plugin来提供Web服务器的WebSphere连接。可以根据自己的需要来选择。</p>
<p><span id="more-541"></span>反向代理是一种简单能用的方式，但mod_proxy的ProxyPassReverse只能处理HTTP Header中的地址变换，如果后端的应用有网页内容动态生成URL的情况，有些mod_proxy+mod_http_proxy就不能完全处理，需要一些其它的module来协助处理。WebSphere Plugin这种情况下的表现会更好些。但也不是所有的情况都会正确。有些mod_proxy没问题的地方反而WebSphere plugin需要一些额外处理。比如Plugin没有提供ProxyPassReverse那样的处理。如果redirect的端口(比如9080)不是apache的默认端口(80)。这时可能需要在Apache下也提供额外端口的监听。这样请示才能被送到WebSphere Plugin中被处理。</p>
<p>WebSpehre Plugin还提供一此额外的优点：</p>
<p>1. 可以被WebSphere Application Server统一管理，自动完成部署应用的配置</p>
<p>2. 提供负载平衡(Load balance)及Failover的能力，满足WebSphere集群配置</p>
<p>(Apache mod_proxy可以考虑mod_proxy_balancer)</p>
<p>3. 提供应用静态资源分享的能力及工具。</p>
<p>(Apache mod_proxy需要时可以来手工处理, ProxyPass path !可以设置不需要代理的url资源，这引起资源可以由apache处理。)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fallday.org/archives/541/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>统一管理存放J2EE EAR项目中的运行库及配置文件</title>
		<link>http://www.fallday.org/archives/538</link>
		<comments>http://www.fallday.org/archives/538#comments</comments>
		<pubDate>Sun, 06 Jun 2010 06:27:23 +0000</pubDate>
		<dc:creator>fallday</dc:creator>
				<category><![CDATA[网站开发]]></category>
		<category><![CDATA[EAR]]></category>
		<category><![CDATA[J2EE]]></category>

		<guid isPermaLink="false">http://www.fallday.org/?p=538</guid>
		<description><![CDATA[J2EE中一个EAR项目中可以包括多个WAR工程，一些公共的包一般可会被多个WAR共用。可以考虑把公共的运行库统一到EAR下被各个WAR访问。另外，有人喜欢把配置文件打包到jar中，但这样并不方便部署时的配置变更。最好把所有的配置文件也统一在EAR下存放管理，比如在EAR下创建一个properties目录。这样可方便配置文件的查看及维护。
可以通过WAR中的MANIFEST.MF文件还设置WAR的classpath, 可以反依赖的EAR库及目录都放进去。
]]></description>
			<content:encoded><![CDATA[<p>J2EE中一个EAR项目中可以包括多个WAR工程，一些公共的包一般可会被多个WAR共用。可以考虑把公共的运行库统一到EAR下被各个WAR访问。另外，有人喜欢把配置文件打包到jar中，但这样并不方便部署时的配置变更。最好把所有的配置文件也统一在EAR下存放管理，比如在EAR下创建一个properties目录。这样可方便配置文件的查看及维护。</p>
<p><span id="more-538"></span>可以通过WAR中的MANIFEST.MF文件还设置WAR的classpath, 可以反依赖的EAR库及目录都放进去。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fallday.org/archives/538/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>OpenSSL命令简介</title>
		<link>http://www.fallday.org/archives/532</link>
		<comments>http://www.fallday.org/archives/532#comments</comments>
		<pubDate>Mon, 03 May 2010 04:34:21 +0000</pubDate>
		<dc:creator>fallday</dc:creator>
				<category><![CDATA[主机管理]]></category>
		<category><![CDATA[操作系统]]></category>
		<category><![CDATA[openssl]]></category>

		<guid isPermaLink="false">http://www.fallday.org/?p=532</guid>
		<description><![CDATA[OpenSSL是一个使用广泛的开源工具。可以方便的做一些编码解码，md5/sha1摘要，aes/des加密解密，以及证书的生成及使用。
Linux操作系统一般都会自带openssl。
以下内容引自OpenSSL Command-Line HOWTO（ http://www.madboa.com/geek/openssl/ ）





How do I find out what OpenSSL version I’m running?



Use the version option.
$ openssl version
OpenSSL 0.9.8b 04 May 2006
You can get much more information with the version -a option.
$ openssl version -a
OpenSSL 0.9.8b 04 May 2006
built on: Fri Sep 29 18:45:58 UTC 2006
platform: debian-i386-i686/cmov
options:  bn(64,32) md2(int) rc4(idx,int) des(ptr,risc1,16,long) blowfish(idx)
compiler: gcc -fPIC -DOPENSSL_PIC [...]]]></description>
			<content:encoded><![CDATA[<p>OpenSSL是一个使用广泛的开源工具。可以方便的做一些编码解码，md5/sha1摘要，aes/des加密解密，以及证书的生成及使用。</p>
<p>Linux操作系统一般都会自带openssl。</p>
<p>以下内容引自OpenSSL Command-Line HOWTO（ <a href="http://www.madboa.com/geek/openssl/">http://www.madboa.com/geek/openssl/</a> ）</p>
<div xml:lang="en">
<div xml:lang="en">
<div>
<div>
<div>
<h3><span id="more-532"></span>How do I find out what OpenSSL version I’m running?</h3>
</div>
</div>
</div>
<p>Use the <code>version</code> option.</p>
<pre>$ <strong><code>openssl version</code></strong>
OpenSSL 0.9.8b 04 May 2006</pre>
<p>You can get much more information with the <code>version -a</code> option.</p>
<pre>$ <strong><code>openssl version -a</code></strong>
OpenSSL 0.9.8b 04 May 2006
built on: Fri Sep 29 18:45:58 UTC 2006
platform: debian-i386-i686/cmov
options:  bn(64,32) md2(int) rc4(idx,int) des(ptr,risc1,16,long) blowfish(idx)
compiler: gcc -fPIC -DOPENSSL_PIC -DZLIB -DOPENSSL_THREADS -D_REENTRANT
-DDSO_DLFCN -DHAVE_DLFCN_H -DL_ENDIAN -DTERMIO -O3 -march=i686
-Wa,--noexecstack -g -Wall -DOPENSSL_BN_ASM_PART_WORDS -DOPENSSL_IA32_SSE2
-DSHA1_ASM -DMD5_ASM -DRMD160_ASM -DAES_ASM
OPENSSLDIR: "/usr/lib/ssl"</pre>
</div>
<div xml:lang="en">
<div>
<div>
<div>
<h3><a id="intro-commands"></a>How do I get a list of the available commands?</h3>
</div>
</div>
</div>
<p>There are three built-in options for getting lists of available commands, but none of them provide what I consider useful output. The best thing to do is provide an invalid command (<strong><code>help</code></strong> or <strong><code>-h</code></strong> will do nicely) to get a readable answer.</p>
<pre>$ <strong><code>openssl help</code></strong>
openssl:Error: 'help' is an invalid command.

Standard commands
asn1parse      ca             ciphers        crl            crl2pkcs7
dgst           dh             dhparam        dsa            dsaparam
ec             ecparam        enc            engine         errstr
gendh          gendsa         genrsa         nseq           ocsp
passwd         pkcs12         pkcs7          pkcs8          prime
rand           req            rsa            rsautl         s_client
s_server       s_time         sess_id        smime          speed
spkac          verify         version        x509           

Message Digest commands (see the `dgst' command for more details)
md2            md4            md5            rmd160         sha
sha1           

Cipher commands (see the `enc' command for more details)
aes-128-cbc    aes-128-ecb    aes-192-cbc    aes-192-ecb    aes-256-cbc
aes-256-ecb    base64         bf             bf-cbc         bf-cfb
bf-ecb         bf-ofb         cast           cast-cbc       cast5-cbc
cast5-cfb      cast5-ecb      cast5-ofb      des            des-cbc
des-cfb        des-ecb        des-ede        des-ede-cbc    des-ede-cfb
des-ede-ofb    des-ede3       des-ede3-cbc   des-ede3-cfb   des-ede3-ofb
des-ofb        des3           desx           rc2            rc2-40-cbc
rc2-64-cbc     rc2-cbc        rc2-cfb        rc2-ecb        rc2-ofb
rc4            rc4-40</pre>
<p>What the shell calls <span>“<span>Standard commands</span>”</span> are the main top-level options.</p>
<p>You can use the same trick with any of the subcommands.</p>
<pre>$ <strong><code>openssl dgst -h</code></strong>
unknown option '-h'
options are
-c              to output the digest with separating colons
-d              to output debug info
-hex            output as hex dump
-binary         output in binary form
-sign   file    sign digest using private key in file
-verify file    verify a signature using public key in file
-prverify file  verify a signature using private key in file
-keyform arg    key file format (PEM or ENGINE)
-signature file signature to verify
-binary         output in binary form
-engine e       use engine e, possibly a hardware device.
-md5 to use the md5 message digest algorithm (default)
-md4 to use the md4 message digest algorithm
-md2 to use the md2 message digest algorithm
-sha1 to use the sha1 message digest algorithm
-sha to use the sha message digest algorithm
-sha256 to use the sha256 message digest algorithm
-sha512 to use the sha512 message digest algorithm
-mdc2 to use the mdc2 message digest algorithm
-ripemd160 to use the ripemd160 message digest algorithm</pre>
<p>In more boring fashion, you can consult the <a title="For further  reading" href="http://www.madboa.com/geek/openssl/#links">OpenSSL man pages</a>.</p>
<div xml:lang="en">
<div>
<div>
<div>
<h3><a id="intro-ciphers"></a>How do I get a list of available ciphers?</h3>
</div>
</div>
</div>
<p>Use the <code>ciphers</code> option. The <a href="http://www.openssl.org/docs/apps/ciphers.html">ciphers(1)</a> man page is quite helpful.</p>
<pre># list all available ciphers
openssl ciphers -v

# list only TLSv1 ciphers
openssl ciphers -v -tls1

# list only high encryption ciphers (keys larger than 128 bits)
openssl ciphers -v 'HIGH'

# list only high encryption ciphers using the AES algorithm
openssl ciphers -v 'AES+HIGH'</pre>
</div>
</div>
<div xml:lang="en">
<div>
<div>
<div>
<h2><a id="benchmark"></a>Benchmarking</h2>
</div>
</div>
</div>
<div xml:lang="en">
<div>
<div>
<div>
<h3><a id="benchmark-speed"></a>How do I benchmark my system’s performance?</h3>
</div>
</div>
</div>
<p>The OpenSSL developers have built a benchmarking suite directly into the <span><strong>openssl</strong></span> binary. It’s accessible via the <code>speed</code> option. It tests how many operations it can perform in a given time, rather than how long it takes to perform a given number of operations. This strikes me a quite sane, because the benchmarks don’t take significantly longer to run on a slow system than on a fast one.</p>
<p>To run a catchall benchmark, run it without any further options.</p>
<pre>openssl speed</pre>
<p>There are two sets of results. The first reports how many bytes per second can be processed for each algorithm, the second the times needed for sign/verify cycles. Here are the results on an 2.16GHz Intel Core 2.</p>
<pre>The 'numbers' are in 1000s of bytes per second processed.
type             16 bytes     64 bytes    256 bytes   1024 bytes   8192 bytes
md2               1736.10k     3726.08k     5165.04k     5692.28k     5917.35k
mdc2                 0.00         0.00         0.00         0.00         0.00
md4              18799.87k    65848.23k   187776.43k   352258.73k   474622.63k
md5              16807.01k    58256.45k   160439.13k   287183.53k   375220.91k
hmac(md5)        23601.24k    74405.08k   189993.05k   309777.75k   379431.59k
sha1             16774.59k    55500.39k   142628.69k   233247.74k   288382.98k
rmd160           13854.71k    40271.23k    87613.95k   124333.06k   141781.67k
rc4             227935.60k   253366.06k   261236.94k   259858.09k   194928.50k
des cbc          48478.10k    49616.16k    49765.21k    50106.71k    50034.01k
des ede3         18387.39k    18631.02k    18699.26k    18738.18k    18718.72k
idea cbc             0.00         0.00         0.00         0.00         0.00
rc2 cbc          19247.24k    19838.12k    19904.51k    19925.33k    19834.98k
rc5-32/12 cbc        0.00         0.00         0.00         0.00         0.00
blowfish cbc     79577.50k    83067.03k    84676.78k    84850.01k    85063.00k
cast cbc         45362.14k    48343.34k    49007.36k    49202.52k    49225.73k
aes-128 cbc      58751.94k    94443.86k   111424.09k   116704.26k   117997.57k
aes-192 cbc      53451.79k    82076.22k    94609.83k    98496.85k    99150.51k
aes-256 cbc      49225.21k    72779.84k    82266.88k    85054.81k    85762.05k
sha256            9359.24k    22510.83k    40963.75k    51710.29k    56014.17k
sha512            7026.78k    28121.32k    54330.79k    86190.76k   104270.51k
                  sign    verify    sign/s verify/s
rsa  512 bits 0.000522s 0.000042s   1915.8  23969.9
rsa 1024 bits 0.002321s 0.000109s    430.8   9191.1
rsa 2048 bits 0.012883s 0.000329s     77.6   3039.6
rsa 4096 bits 0.079055s 0.001074s     12.6    931.3
                  sign    verify    sign/s verify/s
dsa  512 bits 0.000380s 0.000472s   2629.3   2117.9
dsa 1024 bits 0.001031s 0.001240s    969.6    806.2
dsa 2048 bits 0.003175s 0.003744s    314.9    267.1</pre>
<p>You can run any of the algorithm-specific subtests directly.</p>
<pre># test rsa speeds
openssl speed rsa

# do the same test on a two-way SMP system
openssl speed rsa -multi 2</pre>
</div>
<div xml:lang="en">
<div>
<div>
<div>
<h3><a id="benchmark-connection"></a>How do I benchmark remote connections?</h3>
</div>
</div>
</div>
<p>The <code>s_time</code> option lets you test connection performance. The most simple invocation will run for 30 seconds, use any cipher, and use SSL handshaking to determine number of connections per second, using both new and reused sessions:</p>
<pre>openssl s_time -connect remote.host:443</pre>
<p>Beyond that most simple invocation, <code>s_time</code> gives you a wide variety of testing options.</p>
<pre># retrieve remote test.html page using only new sessions
openssl s_time -connect remote.host:443 -www /test.html -new

# similar, using only SSL v3 and high encryption (see
# ciphers(1) man page for cipher strings)
openssl s_time \
  -connect remote.host:443 -www /test.html -new \
  -ssl3 -cipher HIGH

# compare relative performance of various ciphers in
# 10-second tests
IFS=":"
for c in $(openssl ciphers -ssl3 RSA); do
  echo $c
  openssl s_time -connect remote.host:443 \
    -www / -new -time 10 -cipher $c 2&gt;&amp;1 | \
    grep bytes
  echo
done</pre>
<p>If you don’t have an SSL-enabled web server available for your use, you can emulate one using the <code>s_server</code> option.</p>
<pre># on one host, set up the server (using default port 4433)
openssl s_server -cert mycert.pem -www

# on second host (or even the same one), run s_time
openssl s_time -connect myhost:4433 -www / -new -ssl3</pre>
</div>
</div>
<div xml:lang="en">
<div>
<div>
<div>
<h2><a id="cert"></a>Certificates</h2>
</div>
</div>
</div>
<div xml:lang="en">
<div>
<div>
<div>
<h3><a id="cert-self"></a>How do I generate a self-signed certificate?</h3>
</div>
</div>
</div>
<p>You’ll first need to decide whether or not you want to encrypt your key. Doing so means that the key is protected by a passphrase.</p>
<p>On the plus side, adding a passphrase to a key makes it more secure, so the key is less likely to be useful to someone who steals it. The downside, however, is that you’ll have to either store the passphrase in a file or type it manually every time you want to start your web or ldap server.</p>
<p>It violates my normally paranoid nature to say it, but I prefer unencrypted keys, so I don’t have to manually type a passphrase each time a secure daemon is started. (It’s not terribly difficult <a title="How do I  remove a passphrase from a key?" href="http://www.madboa.com/geek/openssl/#key-removepass">to decrypt your key</a> if you later tire of typing a passphrase.)</p>
<p>This example will produce a file called <code>mycert.pem</code> which will contain both the private key and the public certificate based on it. The certificate will be valid for 365 days, and the key (thanks to the <code>-nodes</code> option) is unencrypted.</p>
<pre>openssl req \
  -x509 -nodes -days 365 \
  -newkey rsa:1024 -keyout mycert.pem -out mycert.pem</pre>
<p>Using this command-line invocation, you’ll have to answer a lot of questions: Country Name, State, City, and so on. The tricky question is <span>“<span>Common Name.</span>”</span> You’ll want to answer with the <span><em>hostname or CNAME by which people will address the server</em></span>. This is very important. If your web server’s real hostname is <code>mybox.mydomain.com</code> but people will be using <code>www.mydomain.com</code> to address the box, then use the latter name to answer the <span>“<span>Common Name</span>”</span> question.</p>
<p>Once you’re comfortable with the answers you provide to those questions, you can script the whole thing by adding the <code>-subj</code> option. I’ve included some information about location into the example that follows, but the only thing you really need to include for the certificate to be useful is the hostname (CN).</p>
<pre>openssl req \
  -x509 -nodes -days 365 \
  -subj '/C=US/ST=Oregon/L=Portland/CN=www.madboa.com' \
  -newkey rsa:1024 -keyout mycert.pem -out mycert.pem</pre>
</div>
<div xml:lang="en">
<div>
<div>
<div>
<h3><a id="cert-request"></a>How do I generate a certificate request for VeriSign?</h3>
</div>
</div>
</div>
<p>Applying for a certificate signed by a recognized certificate authority like VeriSign is a complex bureaucratic process. You’ve got to perform all the requisite paperwork before creating a certificate request.</p>
<p>As in the recipe for <a title="How do I  generate a self-signed certificate?" href="http://www.madboa.com/geek/openssl/#cert-self">creating a self-signed certificate</a>, you’ll have to decide whether or not you want a passphrase on your private key. The recipe below assumes you don’t. You’ll end up with two files: a new private key called <code>mykey.pem</code> and a certificate request called <code>myreq.pem</code>.</p>
<pre>openssl req \
  -new -newkey rsa:1024 -nodes \
  -keyout mykey.pem -out myreq.pem</pre>
<p>If you’ve already <a title="How do I  generate an RSA key?" href="http://www.madboa.com/geek/openssl/#key-rsa">got a key</a> and would like to use it for generating the request, the syntax is a bit simpler.</p>
<pre>openssl req -new -key mykey.pem -out myreq.pem</pre>
<p>Similarly, you can also provide subject information on the command line.</p>
<pre>openssl req \
  -new -newkey rsa:1024 -nodes \
  -subj '/CN=www.mydom.com/O=My Dom, Inc./C=US/ST=Oregon/L=Portland' \
  -keyout mykey.pem -out myreq.pem</pre>
<p>When dealing with an institution like VeriSign, you need to take special care to make sure that the information you provide during the creation of the certificate request is <span><em>exactly</em></span> correct. I know from personal experience that even a difference as trivial as substituting <span>“<span>and</span>”</span> for <span>“<span>&amp;</span>”</span> in the Organization Name will stall the process.</p>
<p>If you’d like, you can double check the signature and information provided in the certificate request.</p>
<pre># verify signature
openssl req -in myreq.pem -noout -verify -key mykey.pem

# check info
openssl req -in myreq.pem -noout -text</pre>
<p>Save the key file in a secure location. You’ll need it in order to use the certificate VeriSign sends you. The certificate request will typically be pasted into VeriSign’s online application form.</p></div>
<div xml:lang="en">
<div>
<div>
<div>
<h3><a id="cert-test"></a>How do I test a new certificate?</h3>
</div>
</div>
</div>
<p>The <code>s_server</code> option provides a simple but effective testing method. The example below assumes you’ve combined your key and certificate into one file called <code>mycert.pem</code>.</p>
<p>First, launch the test server on the machine on which the certificate will be used. By default, the server will listen on port 4433; you can alter that using the <code>-accept</code> option.</p>
<pre>openssl s_server -cert mycert.pem -www</pre>
<p>If the server launches without complaint, then chances are good that the certificate is ready for production use.</p>
<p>You can also point your web browser at the test server, <span><em>e.g.</em></span>, <strong><code>https://yourserver:4433/</code></strong>. Don’t forget to specify the <span>“<span>https</span>”</span> protocol; plain-old <span>“<span>http</span>”</span> won’t work. You should see a page listing the various ciphers available and some statistics about your connection. Most modern browsers allow you to examine the certificate as well.</p>
<div xml:lang="en">
<div>
<div>
<div>
<h3><a id="cert-retrieve"></a>How do I retrieve a remote certificate?</h3>
</div>
</div>
</div>
<p>If you combine <span><strong>openssl</strong></span> and <span><strong>sed</strong></span>, you can retrieve remote certificates via a shell one-liner or a simple script.</p>
<pre>#!/bin/sh
#
# usage: retrieve-cert.sh remote.host.name [port]
#
REMHOST=$1
REMPORT=${2:-443}

echo |\
openssl s_client -connect ${REMHOST}:${REMPORT} 2&gt;&amp;1 |\
sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p'</pre>
<p>You can, in turn, pipe that information back to <span><strong>openssl</strong></span> to do things like check the dates on all your active certificates.</p>
<pre>#!/bin/sh
#
for CERT in \
  www.yourdomain.com:443 \
  ldap.yourdomain.com:636 \
  imap.yourdomain.com:993 \
do
  echo |\
  openssl s_client -connect ${CERT} 2&gt;/dev/null |\
  sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' |\
  openssl x509 -noout -subject -dates
done</pre>
</div>
<div xml:lang="en">
<div>
<div>
<div>
<h3><a id="cert-exam"></a>How do I extract information from a certificate?</h3>
</div>
</div>
</div>
<p>An SSL certificate contains a wide range of information: issuer, valid dates, subject, and some hardcore crypto stuff. The <code>x509</code> subcommand is the entry point for retrieving this information. The examples below all assume that the certificate you want to examine is stored in a file named <code>cert.pem</code>.</p>
<p>Using the <code>-text</code> option will give you the full breadth of information.</p>
<pre>openssl x509 -text -in cert.pem</pre>
<p>Other options will provide more targeted sets of data.</p>
<pre># who issued the cert?
openssl x509 -noout -in cert.pem -issuer

# to whom was it issued?
openssl x509 -noout -in cert.pem -subject

# for what dates is it valid?
openssl x509 -noout -in cert.pem -dates

# the above, all at once
openssl x509 -noout -in cert.pem -issuer -subject -dates

# what is its hash value?
openssl x509 -noout -in cert.pem -hash

# what is its MD5 fingerprint?
openssl x509 -noout -in cert.pem -fingerprint</pre>
</div>
<div xml:lang="en">
<div>
<div>
<div>
<h3><a id="cert-pkcs12"></a>How do I export or import a PKCS#12 certificate?</h3>
</div>
</div>
</div>
<p>PKCS#12 files can be imported and exported by a number of applications, including Microsoft IIS. They are often associated with the file extension <code>.pfx</code>.</p>
<p>To create a PKCS#12 certificate, you’ll need a private key and a certificate. During the conversion process, you’ll be given an opportunity to put an <span>“<span>Export Password</span>”</span> (which can be empty, if you choose) on the certificate.</p>
<pre># create a file containing key and self-signed certificate
openssl req \
  -x509 -nodes -days 365 \
  -newkey rsa:1024 -keyout mycert.pem -out mycert.pem

# export mycert.pem as PKCS#12 file, mycert.pfx
openssl pkcs12 -export \
  -out mycert.pfx -in mycert.pem \
  -name "My Certificate"</pre>
<p>If someone sends you a PKCS#12 and any passwords needed to work with it, you can export it into standard PEM format.</p>
<pre># export certificate and passphrase-less key
openssl pkcs12 -in mycert.pfx -out mycert.pem -nodes

# same as above, but you’ll be prompted for a passphrase for
# the private key
openssl pkcs12 -in mycert.pfx -out mycert.pem</pre>
</div>
</div>
<div xml:lang="en">
<div>
<div>
<div>
<h2><a id="verify"></a>Certificate Verification</h2>
</div>
</div>
</div>
<p>Applications linked against the OpenSSL libraries can verify certificates signed by a recognized certificate authority (CA).</p>
<div xml:lang="en">
<div>
<div>
<div>
<h3><a id="verify-standard"></a>How do I verify a certificate?</h3>
</div>
</div>
</div>
<p>Use the <code>verify</code> option to verify certificates.</p>
<pre>openssl verify cert.pem</pre>
<p>If your local OpenSSL installation recognizes the certificate or its signing authority and everything else (dates, signing chain, etc.) checks out, you’ll get a simple OK message.</p>
<pre>$ <strong><code>openssl verify remote.site.pem</code></strong>
remote.site.pem: OK</pre>
<p>If anything is amiss, you’ll see some error messages with short descriptions of the problem, <span><em>e.g.</em></span>,</p>
<div>
<ul>
<li><code>error 10 at 0 depth lookup:certificate has expired</code>. Certificates are typically issued for a limited period of time—usually just one year—and <span><strong>openssl</strong></span> will complain if a certificate has expired.</li>
<li><code>error 18 at 0 depth lookup:self signed certificate</code>. Unless you <a title="How do I  get OpenSSL to recognize/verify a certificate?" href="http://www.madboa.com/geek/openssl/#verify-new">make an exception</a>, OpenSSL won’t verify a self-signed certificate.</li>
</ul>
</div>
</div>
<div xml:lang="en">
<div>
<div>
<div>
<h3><a id="verify-system"></a>What certificate authorities does OpenSSL recognize?</h3>
</div>
</div>
</div>
<p>When OpenSSL was built for your system, it was configured with a <span>“<span>Directory for OpenSSL files.</span>”</span> (That’s the <code>--openssldir</code> option passed to the configure script, for you hands-on types.) This is the directory that typically holds information about certificate authorities your system trusts.</p>
<p>The default location for this directory is <code>/usr/local/ssl</code>, but most vendors put it elsewhere, <span><em>e.g.</em></span>, <code>/usr/share/ssl</code> (Red Hat/Fedora), <code>/etc/ssl</code> (Gentoo), <code>/usr/lib/ssl</code> (Debian), or <code>/System/Library/OpenSSL</code> (Macintosh OS X).</p>
<p>Use the <code>version</code> option to identify which directory (labeled <code>OPENSSLDIR</code>) your installation uses.</p>
<pre>openssl version -d</pre>
<p>Within that directory and a subdirectory called <code>certs</code>, you’re likely to find one or more of three different kinds of files.</p>
<div>
<ol>
<li>A large file called <code>cert.pem</code>, an omnibus collection of many certificates from recognized certificate authorities like VeriSign and Thawte.</li>
<li>Some small files in the <code>certs</code> subdirectory named with a <code>.pem</code> file extension, each of which contains a certificate from a single CA.</li>
<li>Some symlinks in the <code>certs</code> subdirectory with obscure filenames like <code>052eae11.0</code>. There is typically one of these links for each <code>.pem</code> file.The first part of obscure filename is actually a hash value based on the certificate within the <code>.pem</code> file to which it points. The file extension is just an iterator, since it’s theoretically possible that multiple certificates can generate identical hashes.On my Gentoo system, for example, there’s a symlink named <code>f73e89fd.0</code> that points to a file named <code>vsignss.pem</code>. Sure enough, the certificate in that file generates a hash the equates to the name of the symlink:
<pre>$ <strong><code>openssl x509 -noout -hash -in vsignss.pem</code></strong>
f73e89fd</pre>
</li>
</ol>
</div>
<p>When an application encounters a remote certificate, it will typically check to see if the cert can be found in <code>cert.pem</code> or, if not, in a file named after the certificate’s hash value. If found, the certificate is considered verified.</p>
<p>It’s interesting to note that some applications, like Sendmail, allow you to specify at runtime the location of the certificates you trust, while others, like Pine, do not.</p></div>
<div xml:lang="en">
<div>
<div>
<div>
<h3><a id="verify-new"></a>How do I get OpenSSL to recognize/verify a certificate?</h3>
</div>
</div>
</div>
<p>Put the file that contains the certificate you’d like to trust into the <code>certs</code> directory discussed <a title="What  certificate authorities does OpenSSL recognize?" href="http://www.madboa.com/geek/openssl/#verify-system">above</a>. Then create the hash-based symlink. Here’s a little script that’ll do just that.</p>
<pre>#!/bin/sh
#
# usage: certlink.sh filename [filename ...]

for CERTFILE in $*; do
  # make sure file exists and is a valid cert
  test -f "$CERTFILE" || continue
  HASH=$(openssl x509 -noout -hash -in "$CERTFILE")
  test -n "$HASH" || continue

  # use lowest available iterator for symlink
  for ITER in 0 1 2 3 4 5 6 7 8 9; do
    test -f "${HASH}.${ITER}" &amp;&amp; continue
    ln -s "$CERTFILE" "${HASH}.${ITER}"
    test -L "${HASH}.${ITER}" &amp;&amp; break
  done
done</pre>
</div>
</div>
<div xml:lang="en">
<div>
<div>
<div>
<h2><a id="cs"></a>Command-line clients and servers</h2>
</div>
</div>
</div>
<p>The <code>s_client</code> and <code>s_server</code> options provide a way to launch SSL-enabled command-line clients and servers. There are other examples of their use scattered around this document, but this section is dedicated solely to them.</p>
<p>In this section, I assume you are familiar with the specific protocols at issue: SMTP, HTTP, etc. Explaining them is out of the scope of this article.</p>
<div xml:lang="en">
<div>
<div>
<div>
<h3><a id="cs-smtp"></a>How do I connect to a secure SMTP server?</h3>
</div>
</div>
</div>
<p>You can test, or even use, an SSL-enabled SMTP server from the command line using the <code>s_client option</code>.</p>
<p>Secure SMTP servers offer secure connections on up to three ports: 25 (TLS), 465 (SSL), and 587 (TLS). Some time around the 0.9.7 release, the <span><strong>openssl</strong></span> binary was given the ability to use STARTTLS when talking to SMTP servers.</p>
<pre># port 25/TLS; use same syntax for port 587
openssl s_client -connect remote.host:25 -starttls smtp

# port 465/SSL
openssl s_client -connect remote.host:465</pre>
<p><a href="http://www.ietf.org/rfc/rfc0821.txt">RFC821</a> suggests (although it falls short of explicitly specifying) the two characters &#8220;&lt;CRLF&gt;&#8221; as line-terminator. Most mail agents do not care about this and accept either &#8220;&lt;LF&gt;&#8221; or &#8220;&lt;CRLF&gt;&#8221; as line-terminators, but Qmail does not. If you want to comply to the letter with RFC821 and/or communicate with Qmail, use also the <code>-crlf</code> option:</p>
<pre>openssl s_client -connect remote.host:25 -crlf -starttls smtp</pre>
</div>
<div xml:lang="en">
<div>
<div>
<div>
<h3><a id="cs-www"></a>How do I connect to a secure [whatever] server?</h3>
</div>
</div>
</div>
<p>Connecting to a different type of SSL-enabled server is essentially the same operation as outlined above. As of the date of this writing, <span><strong>openssl</strong></span> only supports command-line TLS with SMTP servers, so you have to use straightforward SSL connections with any other protocol.</p>
<pre># https: HTTP over SSL
openssl s_client -connect remote.host:443

# ldaps: LDAP over SSL
openssl s_client -connect remote.host:636

# imaps: IMAP over SSL
openssl s_client -connect remote.host:993

# pop3s: POP-3 over SSL
openssl s_client -connect remote.host:995</pre>
</div>
<div xml:lang="en">
<div>
<div>
<div>
<h3><a id="cs-server"></a>How do I set up an SSL server from the command line?</h3>
</div>
</div>
</div>
<p>The <code>s_server</code> option allows you to set up an SSL-enabled server from the command line, but it’s I wouldn’t recommend using it for anything other than testing or debugging. If you need a production-quality wrapper around an otherwise insecure server, check out <a href="http://www.stunnel.org/">Stunnel</a> instead.</p>
<p>The <code>s_server</code> option works best when you have a certificate; it’s fairly limited without one.</p>
<pre># the -www option will sent back an HTML-formatted status page
# to any HTTP clients that request a page
openssl s_server -cert mycert.pem -www

# the -WWW option "emulates a simple web server. Pages will be
# resolved relative to the current directory." This example
# is listening on the https port, rather than the default
# port 4433
openssl s_server -accept 443 -cert mycert.pem -WWW</pre>
</div>
</div>
<div xml:lang="en">
<div>
<div>
<div>
<h2><a id="digest"></a>Digests</h2>
</div>
</div>
</div>
<p>Generating digests with the <code>dgst</code> option is one of the more straightforward tasks you can accomplish with the <span><strong>openssl</strong></span> binary. Producing digests is done so often, as a matter of fact, that you can find special-use binaries for doing the same thing.</p>
<div xml:lang="en">
<div>
<div>
<div>
<h3><a id="digest-file"></a>How do I create an MD5 or SHA1 digest of a file?</h3>
</div>
</div>
</div>
<p>Digests are created using the <code>dgst</code> option.</p>
<pre># MD5 digest
openssl dgst -md5 filename

# SHA1 digest
openssl dgst -sha1 filename</pre>
<p>The MD5 digests are identical to those created with the widely available <span><strong>md5sum</strong></span> command, though the output formats differ.</p>
<pre>$ <strong><code>openssl dgst -md5 foo-2.23.tar.gz</code></strong>
MD5(foo-2.23.tar.gz)= 81eda7985e99d28acd6d286aa0e13e07
$ <strong><code>md5sum foo-2.23.tar.gz</code></strong>
81eda7985e99d28acd6d286aa0e13e07  foo-2.23.tar.gz</pre>
<p>The same is true for SHA1 digests and the output of the <span><strong>sha1sum</strong></span> application.</p>
<pre>$ <strong><code>openssl dgst -sha1 foo-2.23.tar.gz</code></strong>
SHA1(foo-2.23.tar.gz)= e4eabc78894e2c204d788521812497e021f45c08
$ <strong><code>sha1sum foo-2.23.tar.gz</code></strong>
e4eabc78894e2c204d788521812497e021f45c08  foo-2.23.tar.gz</pre>
</div>
<div xml:lang="en">
<div>
<div>
<div>
<h3><a id="digest-sign"></a>How do I sign a digest?</h3>
</div>
</div>
</div>
<p>If you want to ensure that the digest you create doesn’t get modified without your permission, you can sign it using your <a title="How do I  generate an RSA key?" href="http://www.madboa.com/geek/openssl/#key-rsa">private key</a>. The following example assumes that you want to sign the SHA1 sum of a file called <code>foo-1.23.tar.gz</code>.</p>
<pre># signed digest will be foo-1.23.tar.gz.sha1
openssl dgst -sha1 \
  -sign mykey.pem
  -out foo-1.23.tar.gz.sha1 \
  foo-1.23.tar.gz</pre>
</div>
<div xml:lang="en">
<div>
<div>
<div>
<h3><a id="digest-verify"></a>How do I verify a signed digest?</h3>
</div>
</div>
</div>
<p>To verify a signed digest you’ll need the file from which the digest was derived, the signed digest, and the signer’s <a title="How do I  generate a public RSA key?" href="http://www.madboa.com/geek/openssl/#key-rsapublic">public key</a>.</p>
<pre># to verify foo-1.23.tar.gz using foo-1.23.tar.gz.sha1
# and pubkey.pem
openssl dgst -sha1 \
  -verify pubkey.pem \
  -signature foo-1.23.tar.gz.sha1 \
  foo-1.23.tar.gz</pre>
</div>
<div xml:lang="en">
<div>
<div>
<div>
<h3><a id="digest-apache"></a>How do I create an Apache digest password entry?</h3>
</div>
</div>
</div>
<p>Apache’s HTTP digest authentication feature requires a special password format. Apache ships with the <span><strong>htdigest</strong></span> utility, but it will only write to a file, not to standard output. When working with remote users, it’s sometimes nice for them to be able to generate a password hash on a machine they trust and then mail it for inclusion in your local password database.</p>
<p>The format of the password database is relatively simple: a colon-separated list of the username, authorization realm (specified by the Apache AuthName directive), and an MD5 digest of those two items and the password. Below is a script that duplicates the output of <span><strong>htdigest</strong></span>, except that the output is written to standard output. It takes advantage of the <code>dgst</code> option’s ability to read from standard input.</p>
<pre>#!/bin/bash

echo "Create an Apache-friendly Digest Password Entry"
echo "-----------------------------------------------"

# get user input, disabling tty echoing for password
read -p "Enter username: " UNAME
read -p "Enter Apache AuthName: " AUTHNAME
read -s -p "Enter password: " PWORD; echo

printf "\n%s:%s:%s\n" \
  "$UNAME" \
  "$AUTHNAME" \
  $(printf "${UNAME}:${AUTHNAME}:${PWORD}" | openssl dgst -md5)</pre>
</div>
<div xml:lang="en">
<div>
<div>
<div>
<h3><a id="digest-commands"></a>What other kinds of digests are available?</h3>
</div>
</div>
</div>
<p>Use the built-in <code>list-message-digest-commands</code> option to get a list of the digest types available to your local OpenSSL installation.</p>
<pre>openssl list-message-digest-commands</pre>
</div>
</div>
<div xml:lang="en">
<div>
<div>
<div>
<h2><a id="encrypt"></a>Encryption/Decryption</h2>
</div>
</div>
</div>
<div xml:lang="en">
<div>
<div>
<div>
<h3><a id="encrypt-base64"></a>How do I base64-encode something?</h3>
</div>
</div>
</div>
<p>Use the <code>enc -base64</code> option.</p>
<pre># send encoded contents of file.txt to stdout
openssl enc -base64 -in file.txt

# same, but write contents to file.txt.enc
openssl enc -base64 -in file.txt -out file.txt.enc</pre>
<p>It’s also possible to do a quick command-line encoding of a string value:</p>
<pre>$ <strong><code>echo "encode me" | openssl enc -base64</code></strong>
ZW5jb2RlIG1lCg==</pre>
<p>Note that <span><strong>echo</strong></span> will silently attach a newline character to your string. Consider using its <code>-n</code> option if you want to avoid that situation, which could be important if you’re trying to encode a password or authentication string.</p>
<pre>$ <strong><code>echo -n "encode me" | openssl enc -base64</code></strong>
ZW5jb2RlIG1l</pre>
<p>Use the <code>-d</code> (decode) option to reverse the process.</p>
<pre>$ <strong><code>echo "ZW5jb2RlIG1lCg==" | openssl enc -base64 -d</code></strong>
encode me</pre>
</div>
<div xml:lang="en">
<div>
<div>
<div>
<h3><a id="encrypt-simple"></a>How do I simply encrypt a file?</h3>
</div>
</div>
</div>
<p>Simple file encryption is probably better done using a <a href="http://www.madboa.com/geek/gpg-quickstart/">tool like GPG</a>. Still, you may have occasion to want to encrypt a file without having to build or use a key/certificate structure. All you want to have to remember is a password. It can nearly be that simple—if you can also remember the cipher you employed for encryption.</p>
<p>To choose a cipher, consult the <a href="http://www.openssl.org/docs/apps/enc.html">enc(1) man page</a>. More simply (and perhaps more accurately), you can ask <span><strong>openssl</strong></span> for a list in one of two ways.</p>
<pre># see the list under the 'Cipher commands' heading
openssl -h

# or get a long list, one cipher per line
openssl list-cipher-commands</pre>
<p>After you choose a cipher, you’ll also have to decide if you want to base64-encode the data. Doing so will mean the encrypted data can be, say, pasted into an email message. Otherwise, the output will be a binary file.</p>
<pre># encrypt file.txt to file.enc using 256-bit AES in CBC mode
openssl enc -aes-256-cbc -salt -in file.txt -out file.enc

# the same, only the output is base64 encoded for, e.g., e-mail
openssl enc -aes-256-cbc -a -salt -in file.txt -out file.enc</pre>
<p>To decrypt <code>file.enc</code> you or the file’s recipient will need to remember the cipher and the passphrase.</p>
<pre># decrypt binary file.enc
openssl enc -d -aes-256-cbc -in file.enc

# decrypt base64-encoded version
openssl enc -d -aes-256-cbc -a -in file.enc</pre>
<p>If you’d like to avoid typing a passphrase every time you encrypt or decrypt a file, the <em>openssl(1)</em> man page provides the details under the heading <span>“<span>PASS PHRASE ARGUMENTS.</span>”</span> The format of the password argument is fairly simple.</p>
<pre># provide password on command line
openssl enc -aes-256-cbc -salt -in file.txt \
  -out file.enc -pass pass:mySillyPassword

# provide password in a file
openssl enc -aes-256-cbc -salt -in file.txt \
  -out file.enc -pass file:/path/to/secret/password.txt</pre>
</div>
</div>
<div xml:lang="en">
<div>
<div>
<div>
<h2><a id="error"></a>Errors</h2>
</div>
</div>
</div>
<div xml:lang="en">
<div>
<div>
<div>
<h3><a id="error-interp"></a>How do I interpret SSL error messages?</h3>
</div>
</div>
</div>
<p>Poking through your system logs, you see some error messages that are evidently related to OpenSSL or crypto:</p>
<pre>sshd[31784]: error: RSA_public_decrypt failed: error:0407006A:lib(4):func(112):reason(106)
sshd[770]: error: RSA_public_decrypt failed: error:0407006A:lib(4):func(112):reason(106)</pre>
<p>The first step to figure out what’s going wrong is to use the <code>errstr</code> option to intrepret the error code. The code number is found between <span>“<span>error:</span>”</span> and <span>“<span>:lib</span>”</span>. In this case, it’s 0407006A.</p>
<pre>$ <strong><code>openssl errstr 0407006A</code></strong>
error:0407006A:rsa routines:RSA_padding_check_PKCS1_type_1:block type is not 01</pre>
<p>If you’ve got a full OpenSSL installation, including all the development documentation, you can start your investigation there. In this example, the <em>RSA_padding_add_PKCS1_type_1(3)</em> man page will inform you that PKCS #1 involves block methods for signatures. After that, of course, you’d need to pore through your application’s source code to identify when it would expect be receiving those sorts of packets.</div>
<div xml:lang="en">
<div>
<div>
<div>
<h2><a id="key"></a>Keys</h2>
</div>
</div>
</div>
<div xml:lang="en">
<div>
<div>
<div>
<h3><a id="key-rsa"></a>How do I generate an RSA key?</h3>
</div>
</div>
</div>
<p>Use the <code>genrsa</code> option.</p>
<pre># default 512-bit key, sent to standard output
openssl genrsa

# 1024-bit key, saved to file named mykey.pem
openssl genrsa -out mykey.pem 1024

# same as above, but encrypted with a passphrase
openssl genrsa -des3 -out mykey.pem 1024</pre>
</div>
<div xml:lang="en">
<div>
<div>
<div>
<h3><a id="key-rsapublic"></a>How do I generate a public RSA key?</h3>
</div>
</div>
</div>
<p>Use the <code>rsa</code> option to produce a public version of your private RSA key.</p>
<pre>openssl rsa -in mykey.pem -pubout</pre>
</div>
<div xml:lang="en">
<div>
<div>
<div>
<h3><a id="key-dsa"></a>How do I generate a DSA key?</h3>
</div>
</div>
</div>
<p>Building DSA keys requires a parameter file, and DSA verify operations are slower than their RSA counterparts, so they aren’t as widely used as RSA keys.</p>
<p>If you’re only going to build a single DSA key, you can do so in just one step using the <code>dsaparam</code> subcommand.</p>
<pre># key will be called dsakey.pem
openssl dsaparam -noout -out dsakey.pem -genkey 1024</pre>
<p>If, on the other hand, you’ll be creating several DSA keys, you’ll probably want to build a shared parameter file before generating the keys. It can take a while to build the parameters, but once built, key generation is done quickly.</p>
<pre># create parameters in dsaparam.pem
openssl dsaparam -out dsaparam.pem 1024

# create first key
openssl gendsa -out key1.pem dsaparam.pem

# and second ...
openssl gendsa -out key2.pem dsaparam.pem</pre>
</div>
<div xml:lang="en">
<div>
<div>
<div>
<h3><a id="key-ec"></a>How do I create an elliptic curve key?</h3>
</div>
</div>
</div>
<p>Routines for working with <a href="http://www.secg.org/">elliptic curve cryptography</a> were added to OpenSSL in version 0.9.8. Generating an EC key involves the <code>ecparam</code> option.</p>
<pre>openssl ecparam -out key.pem -name prime256v1 -genkey

# openssl can provide full list of EC parameter names suitable for
# passing to the -name option above:
openssl ecparam -list_curves</pre>
</div>
<div xml:lang="en">
<div>
<div>
<div>
<h3><a id="key-removepass"></a>How do I remove a passphrase from a key?</h3>
</div>
</div>
</div>
<p>Perhaps you’ve grown tired of typing your passphrase every time your secure daemon starts. You can decrypt your key, removing the passphrase requirement, using the <code>rsa</code> or <code>dsa</code> option, depending on the signature algorithm you chose when creating your private key.</p>
<p>If you created an RSA key and it is stored in a standalone file called <code>key.pem</code>, then here’s how to output a decrypted version of the same key to a file called <code>newkey.pem</code>.</p>
<pre># you'll be prompted for your passphrase one last time
openssl rsa -in key.pem -out newkey.pem</pre>
<p>Often, you’ll have your private key and public certificate stored in the same file. If they are stored in a file called <code>mycert.pem</code>, you can construct a decrypted version called <code>newcert.pem</code> in two steps.</p>
<pre># you'll need to type your passphrase once more
openssl rsa -in mycert.pem -out newcert.pem
openssl x509 -in mycert.pem &gt;&gt;newcert.pem</pre>
</div>
</div>
<div xml:lang="en">
<div>
<div>
<div>
<h2><a id="passwd"></a>Password hashes</h2>
</div>
</div>
</div>
<p>Using the <code>passwd</code> option, you can generate password hashes that interoperate with traditional <code>/etc/passwd</code> files, newer-style <code>/etc/shadow</code> files, and Apache password files.</p>
<div xml:lang="en">
<div>
<div>
<div>
<h3><a id="passwd-crypt"></a>How do I generate a crypt-style password hash?</h3>
</div>
</div>
</div>
<p>You can generate a new hash quite simply:</p>
<pre>$ <strong><code>openssl passwd MySecret</code></strong>
8E4vqBR4UOYF.</pre>
<p>If you know an existing password’s <span>“<span>salt,</span>”</span> you can duplicate the hash.</p>
<pre>$ <strong><code>openssl passwd -salt 8E MySecret</code></strong>
8E4vqBR4UOYF.</pre>
</div>
<div xml:lang="en">
<div>
<div>
<div>
<h3><a id="passwd-md5"></a>How do I generate a shadow-style password hash?</h3>
</div>
</div>
</div>
<p>Newer Unix systems use a more secure MD5-based hashing mechanism that uses an eight-character salt (as compared to the two-character salt in traditional crypt()-style hashes). Generating them is still straightforward using the <code>-1</code> option:</p>
<pre>$ <strong><code>openssl passwd -1 MySecret</code></strong>
$1$sXiKzkus$haDZ9JpVrRHBznY5OxB82.</pre>
<p>The salt in this format consists of the eight characters between the second and third dollar signs, in this case <code>sXiKzkus</code>. So you can also duplicate a hash with a known salt and password.</p>
<pre>$ <strong><code>openssl passwd -1 -salt sXiKzkus MySecret</code></strong>
$1$sXiKzkus$haDZ9JpVrRHBznY5OxB82.</pre>
</div>
</div>
<div xml:lang="en">
<div>
<div>
<div>
<h2><a id="prime"></a>Prime numbers</h2>
</div>
</div>
</div>
<p>Current cryptographic techniques rely heavily on the generation and testing of prime numbers, so it’s no surprise that the OpenSSL libraries contain several routines dealing with primes. Beginning with version 0.9.7e (or so), the <code>prime</code> option was added to the openssl binary.</p>
<div xml:lang="en">
<div>
<div>
<div>
<h3><a id="prime-test"></a>How do I test whether a number is prime?</h3>
</div>
</div>
</div>
<p>Pass the number to the <code>prime</code> option. Note that the number returned by openssl will be in hex, not decimal, format.</p>
<pre>$ <strong><code>openssl prime 119054759245460753</code></strong>
1A6F7AC39A53511 is not prime</pre>
<p>You can also pass hex numbers directly.</p>
<pre>$ <strong><code>openssl prime -hex 2f</code></strong>
2F is prime</pre>
</div>
<div xml:lang="en">
<div>
<div>
<div>
<h3><a id="prime-generate"></a>How do I generate a set of prime numbers?</h3>
</div>
</div>
</div>
<p>Pass a bunch of numbers to openssl and see what sticks. The <span><strong>seq</strong></span> utility is useful in this capacity.</p>
<pre># define start and ending points
AQUO=10000
ADQUEM=10100
for N in $(seq $AQUO $ADQUEM); do
  # use bc to convert hex to decimal
  openssl prime $N | awk '/is prime/ {print "ibase=16;"$1}' | bc
done</pre>
</div>
</div>
<div xml:lang="en">
<div>
<div>
<div>
<h2><a id="random"></a>Random data</h2>
</div>
</div>
</div>
<div xml:lang="en">
<div>
<div>
<div>
<h3><a id="random-generate"></a>How do I generate random data?</h3>
</div>
</div>
</div>
<p>Use the <code>rand</code> option to generate binary or base64-encoded data.</p>
<pre># write 128 random bytes of base64-encoded data to stdout
openssl rand -base64 128

# write 1024 bytes of binary random data to a file
openssl rand -out random-data.bin 1024

# seed openssl with semi-random bytes from browser cache
cd $(find ~/.mozilla/firefox -type d -name Cache)
openssl rand -rand $(find . -type f -printf '%f:') -base64 1024</pre>
<p>On a Unix box with a <code>/dev/urandom</code> device and a copy of GNU <span><strong>head</strong></span>, you can achieve a similar effect, often with better entropy:</p>
<pre># get 32 bytes from /dev/urandom and base64 encode them
head -c 32 /dev/urandom | openssl enc -base64</pre>
<p>Make sure you know the trade-offs between the <code>random</code> and <code>urandom</code> devices before relying on them for truly critical entropy. Consult the <em>random(4)</em> man page on Linux and BSD systems, or <em>random(7D)</em> on Solaris, for further information.</div>
<div xml:lang="en">
<div>
<div>
<div>
<h2><a id="smime"></a>S/MIME</h2>
</div>
</div>
</div>
<p><a href="http://www.ietf.org/html.charters/smime-charter.html">S/MIME</a> is a standard for sending and receiving secure MIME data, especially in e-mail messages. Automated S/MIME capabilities have been added to quite a few e-mail clients, though <span><strong>openssl</strong></span> can provide command-line S/MIME services using the <code>smime</code> option.</p>
<p>Note that the documentation in the <a href="http://www.openssl.org/docs/apps/smime.html">smime(1)</a> man page includes a number of good examples.</p>
<div xml:lang="en">
<div>
<div>
<div>
<h3><a id="smime-verify"></a>How do I verify a signed S/MIME message?</h3>
</div>
</div>
</div>
<p>It’s pretty easy to verify a signed message. Use your mail client to save the signed message to a file. In this example, I assume that the file is named <code>msg.txt</code>.</p>
<pre>openssl smime -verify -in msg.txt</pre>
<p>If the sender’s certificate is signed by a certificate authority trusted by your OpenSSL infrastructure, you’ll see some mail headers, a copy of the message, and a concluding line that says <code>Verification successful</code>.</p>
<p>If the messages has been modified by an unauthorized party, the output will conclude with a failure message indicating that the digest and/or the signature doesn’t match what you received:</p>
<pre>Verification failure
23016:error:21071065:PKCS7 routines:PKCS7_signatureVerify:digest
failure:pk7_doit.c:804:
23016:error:21075069:PKCS7 routines:PKCS7_verify:signature
failure:pk7_smime.c:265:</pre>
<p>Likewise, if the sender’s certificate isn’t recognized by your OpenSSL infrastructure, you’ll get a similar error:</p>
<pre>Verification failure
9544:error:21075075:PKCS7 routines:PKCS7_verify:certificate verify
error:pk7_smime.c:222:Verify error:self signed certificate</pre>
<p>Most e-mail clients send a copy of the public certificate in the signature attached to the message. From the command line, you can view the certificate data yourself. You’ll use the <code>smime -pk7out</code> option to pipe a copy of the PKCS#7 certificate back into the <code>pkcs7</code> option. It’s oddly cumbersome but it works.</p>
<pre>openssl smime -pk7out -in msg.txt | \
openssl pkcs7 -text -noout -print_certs</pre>
<p>If you’d like to extract a copy of your correspondent’s certificate for long-term use, use just the first part of that pipe.</p>
<pre>openssl smime -pk7out -in msg.txt -out her-cert.pem</pre>
<p>At that point, you can either <a title="How do I  get OpenSSL to recognize/verify a certificate?" href="http://www.madboa.com/geek/openssl/#verify-new">integrate it into your OpenSSL infrastructure</a> or you can save it off somewhere for special use.</p>
<pre>openssl smime -verify -in msg.txt -CAfile /path/to/her-cert.pem</pre>
</div>
<div xml:lang="en">
<div>
<div>
<div>
<h3><a id="smime-encrypt"></a>How do I encrypt a S/MIME message?</h3>
</div>
</div>
</div>
<p>Let’s say that someone sends you her public certificate and asks that you encrypt some message to her. You’ve saved her certificate as <code>her-cert.pem</code>. You’ve saved your reply as <code>my-message.txt</code>.</p>
<p>To get the default—though fairly weak—RC2-40 encryption, you just tell <span><strong>openssl</strong></span> where the message and the certificate are located.</p>
<pre>openssl smime her-cert.pem -encrypt -in my-message.txt</pre>
<p>If you’re pretty sure your remote correspondent has a robust SSL toolkit, you can specify a stronger encryption algorithm like triple DES:</p>
<pre>openssl smime her-cert.pem -encrypt -des3 -in my-message.txt</pre>
<p>By default, the encrypted message, including the mail headers, is sent to standard output. Use the <code>-out</code> option or your shell to redirect it to a file. Or, much trickier, pipe the output directly to <span><strong>sendmail</strong></span>.</p>
<pre>openssl smime her-cert.pem \
  -encrypt \
  -des3 \
  -in my-message.txt \
  -from 'Your Fullname &lt;you@youraddress.com&gt;' \
  -to 'Her Fullname &lt;her@heraddress.com&gt;' \
  -subject 'My encrypted reply' |\
sendmail her@heraddress.com</pre>
</div>
<div xml:lang="en">
<div>
<div>
<div>
<h3><a id="smime-sign"></a>How do I sign a S/MIME message?</h3>
</div>
</div>
</div>
<p>If you don’t need to encrypt the entire message, but you do want to sign it so that your recipient can be assured of the message’s integrity, the recipe is similar to that for <a title="How do I encrypt a S/MIME message?" href="http://www.madboa.com/geek/openssl/#smime-encrypt">encryption</a>. The main difference is that you need to have your own key and certificate, since you can’t sign anything with the recipient’s cert.</p>
<pre>openssl smime \
  -sign \
  -signer /path/to/your-cert.pem \
  -in my-message.txt \
  -from 'Your Fullname &lt;you@youraddress.com&gt;' \
  -to 'Her Fullname &lt;her@heraddress.com&gt;' \
  -subject 'My signed reply' |\
sendmail <a href="mailto:her@heraddress.com">her@heraddress.com</a></pre>
</div>
</div>
<div xml:lang="en">
<div>
<div>
<div><strong>下面是引自网上的翻译：</strong></div>
<div><strong>1、如何知道我的OpenSSL运行版本</strong></div>
<p style="MARGIN: 1em 1em 0pt; FONT-WEIGHT: bold">QUOTE:</p>
<blockquote style="BORDER-BOTTOM: #dddddd 1px dotted; BORDER-LEFT: #dddddd 1px dotted; PADDING-BOTTOM: 0.5em; LINE-HEIGHT: 1.8em; MARGIN: 0pt 1em 1em; PADDING-LEFT: 0.5em; PADDING-RIGHT: 0.5em; BORDER-TOP: #dddddd 1px dotted; BORDER-RIGHT: #dddddd 1px dotted; PADDING-TOP: 0.5em"><p># openssl version<br />
OpenSSL 0.9.7a Feb 19 2003</p></blockquote>
<p>-a参数可以获得更详细的信息：</p>
<p style="MARGIN: 1em 1em 0pt; FONT-WEIGHT: bold">QUOTE:</p>
<blockquote style="BORDER-BOTTOM: #dddddd 1px dotted; BORDER-LEFT: #dddddd 1px dotted; PADDING-BOTTOM: 0.5em; LINE-HEIGHT: 1.8em; MARGIN: 0pt 1em 1em; PADDING-LEFT: 0.5em; PADDING-RIGHT: 0.5em; BORDER-TOP: #dddddd 1px dotted; BORDER-RIGHT: #dddddd 1px dotted; PADDING-TOP: 0.5em"><p># openssl version -a<br />
OpenSSL 0.9.7a Feb 19 2003<br />
built on: Tue Oct 31 02:10:29 EST 2006<br />
platform: linux-elf<br />
options:  bn(64,32) md2(int) rc4(idx,int) des(ptr,risc1,16,long) blowfish(idx)<br />
compiler: gcc -fPIC -DZLIB -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -DKRB5_MIT -DOPENSSL_NO_ASM -DOPENSSL_NO_IDEA -DOPENSSL_NO_MDC2 -DOPENSSL_NO_RC5 -DOPENSSL_NO_EC -I/usr/kerberos/include -DL_ENDIAN -DTERMIO -Wall -O2 -g -march=i386 -mcpu=i686 -Wa,&#8211;noexecstack<br />
OPENSSLDIR: &#8220;/usr/share/ssl&#8221;<br />
engines:  dynamic cswift chil atalla nuron ubsec aep ibmca sureware 4758cca</p></blockquote>
<p><strong>2、获取可用的命令列表</strong><br />
OpenSSL提供三个内置的选项命令组，而通过提供一个错误的参数，可以获得其帮助信息。（例如help、或-h）</p>
<p style="MARGIN: 1em 1em 0pt; FONT-WEIGHT: bold">QUOTE:</p>
<blockquote style="BORDER-BOTTOM: #dddddd 1px dotted; BORDER-LEFT: #dddddd 1px dotted; PADDING-BOTTOM: 0.5em; LINE-HEIGHT: 1.8em; MARGIN: 0pt 1em 1em; PADDING-LEFT: 0.5em; PADDING-RIGHT: 0.5em; BORDER-TOP: #dddddd 1px dotted; BORDER-RIGHT: #dddddd 1px dotted; PADDING-TOP: 0.5em"><p># openssl -h<br />
openssl:Error: &#8216;-h&#8217; is an invalid command.</p>
<p>Standard commands<br />
asn1parse      ca             ciphers        crl            crl2pkcs7<br />
dgst           dh             dhparam        dsa            dsaparam<br />
enc            engine         errstr         gendh          gendsa<br />
genrsa         nseq           ocsp           passwd         pkcs12<br />
pkcs7          pkcs8          rand           req            rsa<br />
rsautl         s_client       s_server       s_time         sess_id<br />
smime          speed          spkac          verify         version<br />
x509</p>
<p>Message Digest commands (see the `dgst&#8217; command for more details)<br />
md2            md4            md5            rmd160         sha<br />
sha1</p>
<p>Cipher commands (see the `enc&#8217; command for more details)<br />
aes-128-cbc    aes-128-ecb    aes-192-cbc    aes-192-ecb    aes-256-cbc<br />
aes-256-ecb    base64         bf             bf-cbc         bf-cfb<br />
bf-ecb         bf-ofb         cast           cast-cbc       cast5-cbc<br />
cast5-cfb      cast5-ecb      cast5-ofb      des            des-cbc<br />
des-cfb        des-ecb        des-ede        des-ede-cbc    des-ede-cfb<br />
des-ede-ofb    des-ede3       des-ede3-cbc   des-ede3-cfb   des-ede3-ofb<br />
des-ofb        des3           desx           rc2            rc2-40-cbc<br />
rc2-64-cbc     rc2-cbc        rc2-cfb        rc2-ecb        rc2-ofb<br />
rc4            rc4-40</p></blockquote>
<p>也可以获取某个命令组可用的参数：</p>
<p style="MARGIN: 1em 1em 0pt; FONT-WEIGHT: bold">QUOTE:</p>
<blockquote style="BORDER-BOTTOM: #dddddd 1px dotted; BORDER-LEFT: #dddddd 1px dotted; PADDING-BOTTOM: 0.5em; LINE-HEIGHT: 1.8em; MARGIN: 0pt 1em 1em; PADDING-LEFT: 0.5em; PADDING-RIGHT: 0.5em; BORDER-TOP: #dddddd 1px dotted; BORDER-RIGHT: #dddddd 1px dotted; PADDING-TOP: 0.5em"><p># openssl dgst -h<br />
unknown option &#8216;-h&#8217;<br />
options are<br />
-c              to output the digest with separating colons<br />
-d              to output debug info<br />
-hex            output as hex dump<br />
-binary         output in binary form<br />
-sign   file    sign digest using private key in file<br />
-verify file    verify a signature using public key in file<br />
-prverify file  verify a signature using private key in file<br />
-keyform arg    key file format (PEM or ENGINE)<br />
-signature file signature to verify<br />
-binary         output in binary form<br />
-engine e       use engine e, possibly a hardware device.<br />
-md5 to use the md5 message digest algorithm (default)<br />
-md4 to use the md4 message digest algorithm<br />
-md2 to use the md2 message digest algorithm<br />
-sha1 to use the sha1 message digest algorithm<br />
-sha to use the sha message digest algorithm<br />
-mdc2 to use the mdc2 message digest algorithm<br />
-ripemd160 to use the ripemd160 message digest algorithm</p></blockquote>
<p><strong>3、如何获取可用的密码（ciphers）列表</strong></p>
<p style="MARGIN: 1em 1em 0pt; FONT-WEIGHT: bold">QUOTE:</p>
<blockquote style="BORDER-BOTTOM: #dddddd 1px dotted; BORDER-LEFT: #dddddd 1px dotted; PADDING-BOTTOM: 0.5em; LINE-HEIGHT: 1.8em; MARGIN: 0pt 1em 1em; PADDING-LEFT: 0.5em; PADDING-RIGHT: 0.5em; BORDER-TOP: #dddddd 1px dotted; BORDER-RIGHT: #dddddd 1px dotted; PADDING-TOP: 0.5em"><p># 显示所有可用的密码（ciphers）列表<br />
openssl ciphers -v<br />
# 仅显示TLSv1版本的密码<br />
openssl ciphers -v -tls1<br />
# 仅显示密钥大于128bit的高强度密码方式<br />
openssl ciphers -v &#8216;HIGH&#8217;<br />
# 仅显示使用AES运算法则的高强度密码方式<br />
openssl ciphers -v &#8216;AES+HIGH&#8217;</p></blockquote>
<p><strong><span style="color: #4169e1;">三、性能测试</span></strong><br />
OpenSSL提供内置的性能测试组件，其通过speed选项，可以测试在一段时间内可以执行的操作数量，而不是测试固定数量操作的时间，这能确保即使是慢的系统，也不会花费过长的时间。<br />
<strong>1、如何进行性能测试</strong></p>
<p style="MARGIN: 1em 1em 0pt; FONT-WEIGHT: bold">QUOTE:</p>
<blockquote style="BORDER-BOTTOM: #dddddd 1px dotted; BORDER-LEFT: #dddddd 1px dotted; PADDING-BOTTOM: 0.5em; LINE-HEIGHT: 1.8em; MARGIN: 0pt 1em 1em; PADDING-LEFT: 0.5em; PADDING-RIGHT: 0.5em; BORDER-TOP: #dddddd 1px dotted; BORDER-RIGHT: #dddddd 1px dotted; PADDING-TOP: 0.5em"><p># 执行一个完整的性能测试<br />
openssl speed<br />
# 仅进行rsa的速度测试<br />
openssl speed rsa<br />
# 在一个SMP系统中，进行2路的rsa速度测试<br />
openssl speed rsa -multi 2</p></blockquote>
<p><strong>2、如何测试远程连接的性能</strong><br />
使用s_time运行你测试远程连接的性能（30sec）：</p>
<p style="MARGIN: 1em 1em 0pt; FONT-WEIGHT: bold">CODE:</p>
<p><code style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 0.5em; MARGIN: 0pt 1em 1em; PADDING-LEFT: 0.5em; PADDING-RIGHT: 0.5em; DISPLAY: block; FONT: 12px/1.8em Courier,monospace; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 0.5em">openssl s_time -connect remote.host:443</code>除了简单的测试外，s_time也允许进行指定的测试项目：</p>
<p style="MARGIN: 1em 1em 0pt; FONT-WEIGHT: bold">QUOTE:</p>
<blockquote style="BORDER-BOTTOM: #dddddd 1px dotted; BORDER-LEFT: #dddddd 1px dotted; PADDING-BOTTOM: 0.5em; LINE-HEIGHT: 1.8em; MARGIN: 0pt 1em 1em; PADDING-LEFT: 0.5em; PADDING-RIGHT: 0.5em; BORDER-TOP: #dddddd 1px dotted; BORDER-RIGHT: #dddddd 1px dotted; PADDING-TOP: 0.5em"><p># 使用新的session接收远程的test.html页面<br />
openssl s_time -connect remote.host:443 -www /test.html -new<br />
# 类似的，仅使用SSL v3版本和高强度的加密<br />
openssl s_time \<br />
  -connect remote.host:443 -www /test.html -new \<br />
  -ssl3 -cipher HIGH<br />
# 对比多个加密规则在10秒内连接的性能情况<br />
IFS=&#8221;:&#8221;<br />
for c in $(openssl ciphers -ssl3 RSA); do<br />
  echo $c<br />
  openssl s_time -connect remote.host:443 \<br />
    -www / -new -time 10 -cipher $c 2&gt;&amp;1 | \<br />
    grep bytes<br />
  echo<br />
done</p></blockquote>
<p>如果你并没有SSL支持的Web服务器可以使用，你可以用s_server选项模拟：</p>
<p style="MARGIN: 1em 1em 0pt; FONT-WEIGHT: bold">QUOTE:</p>
<blockquote style="BORDER-BOTTOM: #dddddd 1px dotted; BORDER-LEFT: #dddddd 1px dotted; PADDING-BOTTOM: 0.5em; LINE-HEIGHT: 1.8em; MARGIN: 0pt 1em 1em; PADDING-LEFT: 0.5em; PADDING-RIGHT: 0.5em; BORDER-TOP: #dddddd 1px dotted; BORDER-RIGHT: #dddddd 1px dotted; PADDING-TOP: 0.5em"><p># 主机一，建立服务端（默认使用4433端口）<br />
openssl s_server -cert mycert.pem -www<br />
# 主机二，通过s_time连接到指定的4433端口进行测试<br />
openssl s_time -connect myhost:4433 -www / -new -ssl3</p></blockquote>
<p>[newpage]<br />
<strong><span style="color: #4169e1;">四、证书</span></strong><br />
<strong>1、如何创建一个self-signed证书</strong><br />
首先，你需要决定是否使用短语（passphrase）加密你的密钥。一方面，使用短语加密密钥可以更安全，可以即使密钥被盗也不能使用；但另一方面，这意味着在启动web或ldap服务前，你需要把短语保存到文件上，或者手动的输入。先以一个没有短语的密钥为例。<br />
下面的例子创建一个包含私钥和公钥的mycert.pem文件，该证书有效期为365日，而使用-nodes表示为不加密的密钥：</p>
<p style="MARGIN: 1em 1em 0pt; FONT-WEIGHT: bold">CODE:</p>
<p><code style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 0.5em; MARGIN: 0pt 1em 1em; PADDING-LEFT: 0.5em; PADDING-RIGHT: 0.5em; DISPLAY: block; FONT: 12px/1.8em Courier,monospace; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 0.5em">openssl req \<br />
  -x509 -nodes -days 365 \<br />
  -newkey rsa:1024 -keyout mycert.pem -out mycert.pem</code>使用该命令，你将需要回答一连串的问题：Country Name, State, City等，特别是Common Name，是一个非常重要的区分信息。如果你的web服务器实际主机名是mybox.mydomain.com，而人们访问的是使用<a href="http://www.mydomain.com/" target="_blank">www.mydomain.com</a>来访问，那么你应该使用<a href="http://www.mydomain.com/" target="_blank">www.mydomain.com</a>来填写Common Name。<br />
使用-subj参数，可以更方便的填写这些信息：</p>
<p style="MARGIN: 1em 1em 0pt; FONT-WEIGHT: bold">CODE:</p>
<p><code style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 0.5em; MARGIN: 0pt 1em 1em; PADDING-LEFT: 0.5em; PADDING-RIGHT: 0.5em; DISPLAY: block; FONT: 12px/1.8em Courier,monospace; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 0.5em">openssl req \<br />
  -x509 -nodes -days 365 \<br />
  -subj '/C=US/ST=Oregon/L=Portland/CN=www.madboa.com' \<br />
  -newkey rsa:1024 -keyout mycert.pem -out mycert.pem</code><strong>2、如何创建一个给 VeriSign的证书</strong><br />
当为类似VeriSign的机构生成一个证书是比较复杂的官僚过程。在创建证书前，需要提交所有必须的文书文件。同上面一样，你必须考虑是否使用短语来加密你的密钥。下面都是假设你不使用这种方式。而得到一个叫mykey.pem的私钥文件，和myreq.pem的认证请求文件：</p>
<p style="MARGIN: 1em 1em 0pt; FONT-WEIGHT: bold">CODE:</p>
<p><code style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 0.5em; MARGIN: 0pt 1em 1em; PADDING-LEFT: 0.5em; PADDING-RIGHT: 0.5em; DISPLAY: block; FONT: 12px/1.8em Courier,monospace; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 0.5em">openssl req \<br />
  -new -newkey rsa:1024 -nodes \<br />
  -keyout mykey.pem -out myreq.pem</code>如果你已经有私钥，而希望通过它生成认证请求文件，可以这样：</p>
<p style="MARGIN: 1em 1em 0pt; FONT-WEIGHT: bold">CODE:</p>
<p><code style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 0.5em; MARGIN: 0pt 1em 1em; PADDING-LEFT: 0.5em; PADDING-RIGHT: 0.5em; DISPLAY: block; FONT: 12px/1.8em Courier,monospace; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 0.5em">openssl req -new -key mykey.pem -out myreq.pem</code>类似的，你也可以一同在命令行中提交证书信息：</p>
<p style="MARGIN: 1em 1em 0pt; FONT-WEIGHT: bold">CODE:</p>
<p><code style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 0.5em; MARGIN: 0pt 1em 1em; PADDING-LEFT: 0.5em; PADDING-RIGHT: 0.5em; DISPLAY: block; FONT: 12px/1.8em Courier,monospace; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 0.5em">openssl req \<br />
  -new -newkey rsa:1024 -nodes \<br />
  -subj '/CN=www.mydom.com/O=My Dom, Inc./C=US/ST=Oregon/L=Portland' \<br />
  -keyout mykey.pem -out myreq.pem</code>当处理类似VeriSign的机构，你需要特别留意，所提交的信息资料都必须正确无误。即使在Organization Name中的“and”和“&amp;”区别都会引起麻烦。当你提交证书请求前，应double check一次：</p>
<p style="MARGIN: 1em 1em 0pt; FONT-WEIGHT: bold">QUOTE:</p>
<blockquote style="BORDER-BOTTOM: #dddddd 1px dotted; BORDER-LEFT: #dddddd 1px dotted; PADDING-BOTTOM: 0.5em; LINE-HEIGHT: 1.8em; MARGIN: 0pt 1em 1em; PADDING-LEFT: 0.5em; PADDING-RIGHT: 0.5em; BORDER-TOP: #dddddd 1px dotted; BORDER-RIGHT: #dddddd 1px dotted; PADDING-TOP: 0.5em"><p># 校验签名<br />
openssl req -in myreq.pem -noout -verify -key mykey.pem<br />
# 检查信息<br />
openssl req -in myreq.pem -noout -text</p></blockquote>
<p>请把密钥文件存放在安全的地方。你需要它来使用VeriSign发给你的信息。然后，在VeriSign上提交证书请求即可。<br />
<strong>3、我如何测试一个新的证书</strong><br />
使用s_server选项是最简单的测试方法。下面的例子假设你的密钥和证书都放在mycert.pem中。<br />
首先，在测试端加载该证书，默认使用4433端口（可使用-accept选项修改）：</p>
<p style="MARGIN: 1em 1em 0pt; FONT-WEIGHT: bold">CODE:</p>
<p><code style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 0.5em; MARGIN: 0pt 1em 1em; PADDING-LEFT: 0.5em; PADDING-RIGHT: 0.5em; DISPLAY: block; FONT: 12px/1.8em Courier,monospace; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 0.5em">openssl s_server -cert mycert.pem -www</code>如果加载顺利，那么，你使用浏览器访问https://yourserver:4433/，你应该可以看到一个使用不同密码和关于你连接状态信息的页面。而大部分的浏览器也允许你测试该正式的有效性。<br />
<strong>4、我如何重新得到一个远程的证书</strong><br />
如果你懂openssl和sed，可以通过下面的脚本实现：</p>
<p style="MARGIN: 1em 1em 0pt; FONT-WEIGHT: bold">QUOTE:</p>
<blockquote style="BORDER-BOTTOM: #dddddd 1px dotted; BORDER-LEFT: #dddddd 1px dotted; PADDING-BOTTOM: 0.5em; LINE-HEIGHT: 1.8em; MARGIN: 0pt 1em 1em; PADDING-LEFT: 0.5em; PADDING-RIGHT: 0.5em; BORDER-TOP: #dddddd 1px dotted; BORDER-RIGHT: #dddddd 1px dotted; PADDING-TOP: 0.5em"><p>#!/bin/sh<br />
#<br />
# usage: retrieve-cert.sh remote.host.name [port]<br />
#<br />
REMHOST=$1<br />
REMPORT=${2:-443}</p>
<p>echo |\<br />
openssl s_client -connect ${REMHOST}:${REMPORT} 2&gt;&amp;1 |\<br />
sed -ne &#8216;/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p&#8217;</p></blockquote>
<p><strong>5、如何从证书获得信息</strong><br />
一个SSL证书包括很多的信息，使用x509子命令，可以得到这些信息。下面的例子假设证书名称为：cert.pem。使用-text选项可以得到全部的信息：</p>
<p style="MARGIN: 1em 1em 0pt; FONT-WEIGHT: bold">CODE:</p>
<p><code style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 0.5em; MARGIN: 0pt 1em 1em; PADDING-LEFT: 0.5em; PADDING-RIGHT: 0.5em; DISPLAY: block; FONT: 12px/1.8em Courier,monospace; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 0.5em">openssl x509 -text -in cert.pem</code>使用不同的参数，可以获得指定的数据：</p>
<p style="MARGIN: 1em 1em 0pt; FONT-WEIGHT: bold">QUOTE:</p>
<blockquote style="BORDER-BOTTOM: #dddddd 1px dotted; BORDER-LEFT: #dddddd 1px dotted; PADDING-BOTTOM: 0.5em; LINE-HEIGHT: 1.8em; MARGIN: 0pt 1em 1em; PADDING-LEFT: 0.5em; PADDING-RIGHT: 0.5em; BORDER-TOP: #dddddd 1px dotted; BORDER-RIGHT: #dddddd 1px dotted; PADDING-TOP: 0.5em"><p># who issued the cert?<br />
openssl x509 -noout -in cert.pem -issuer<br />
# to whom was it issued?<br />
openssl x509 -noout -in cert.pem -subject<br />
# for what dates is it valid?<br />
openssl x509 -noout -in cert.pem -dates<br />
# the above, all at once<br />
openssl x509 -noout -in cert.pem -issuer -subject -dates<br />
# what is its hash value?<br />
openssl x509 -noout -in cert.pem -hash<br />
# what is its MD5 fingerprint?<br />
openssl x509 -noout -in cert.pem -fingerprint</p></blockquote>
<p><strong>6、如何导出或导入一个 PKCS#12证书</strong><br />
PKCS#12可以有一些如IIS等的应用程序导出或导入。它们通常使用.pfx的扩展文件名。<br />
要创建一个PKCS#12证书，你需要一个私钥和证书。在下面的转换过程中，你有机会为证书输入一个“Export Password”（也可以留空）：<br />
# 创建一个包括密钥和自签名的证书文件</p>
<p style="MARGIN: 1em 1em 0pt; FONT-WEIGHT: bold">QUOTE:</p>
<blockquote style="BORDER-BOTTOM: #dddddd 1px dotted; BORDER-LEFT: #dddddd 1px dotted; PADDING-BOTTOM: 0.5em; LINE-HEIGHT: 1.8em; MARGIN: 0pt 1em 1em; PADDING-LEFT: 0.5em; PADDING-RIGHT: 0.5em; BORDER-TOP: #dddddd 1px dotted; BORDER-RIGHT: #dddddd 1px dotted; PADDING-TOP: 0.5em"><p>openssl req \<br />
  -x509 -nodes -days 365 \<br />
  -newkey rsa:1024 -keyout mycert.pem -out mycert.pem<br />
# 把mycert.pem导出为mycert.pfx的PKCS#12文件<br />
openssl pkcs12 -export \<br />
  -out mycert.pfx -in mycert.pem \<br />
  -name &#8220;My Certificate&#8221;</p></blockquote>
<p>如果有人发给你的是PKCS#12文件（含Export Password），你也可以export它为标准的PEM格式：<br />
# 导出证书和短语密钥</p>
<p style="MARGIN: 1em 1em 0pt; FONT-WEIGHT: bold">CODE:</p>
<p><code style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 0.5em; MARGIN: 0pt 1em 1em; PADDING-LEFT: 0.5em; PADDING-RIGHT: 0.5em; DISPLAY: block; FONT: 12px/1.8em Courier,monospace; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 0.5em">openssl pkcs12 -in mycert.pfx -out mycert.pem -nodes</code># 手动输入短语来导出证书</p>
<p style="MARGIN: 1em 1em 0pt; FONT-WEIGHT: bold">CODE:</p>
<p><code style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 0.5em; MARGIN: 0pt 1em 1em; PADDING-LEFT: 0.5em; PADDING-RIGHT: 0.5em; DISPLAY: block; FONT: 12px/1.8em Courier,monospace; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 0.5em">openssl pkcs12 -in mycert.pfx -out mycert.pem</code><strong><span style="color: #4169e1;">五、确认证书</span></strong><br />
<strong>1、如何验证一个证书</strong><br />
使用verify选项即可：</p>
<p style="MARGIN: 1em 1em 0pt; FONT-WEIGHT: bold">CODE:</p>
<p><code style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 0.5em; MARGIN: 0pt 1em 1em; PADDING-LEFT: 0.5em; PADDING-RIGHT: 0.5em; DISPLAY: block; FONT: 12px/1.8em Courier,monospace; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 0.5em">openssl verify cert.pem</code>当验证通过，会显示OK信息：</p>
<p style="MARGIN: 1em 1em 0pt; FONT-WEIGHT: bold">QUOTE:</p>
<blockquote style="BORDER-BOTTOM: #dddddd 1px dotted; BORDER-LEFT: #dddddd 1px dotted; PADDING-BOTTOM: 0.5em; LINE-HEIGHT: 1.8em; MARGIN: 0pt 1em 1em; PADDING-LEFT: 0.5em; PADDING-RIGHT: 0.5em; BORDER-TOP: #dddddd 1px dotted; BORDER-RIGHT: #dddddd 1px dotted; PADDING-TOP: 0.5em"><p>$ openssl verify remote.site.pem<br />
remote.site.pem: OK</p></blockquote>
<p>如果有错误，可得到简短的问题描述：</p>
<p style="MARGIN: 1em 1em 0pt; FONT-WEIGHT: bold">QUOTE:</p>
<blockquote style="BORDER-BOTTOM: #dddddd 1px dotted; BORDER-LEFT: #dddddd 1px dotted; PADDING-BOTTOM: 0.5em; LINE-HEIGHT: 1.8em; MARGIN: 0pt 1em 1em; PADDING-LEFT: 0.5em; PADDING-RIGHT: 0.5em; BORDER-TOP: #dddddd 1px dotted; BORDER-RIGHT: #dddddd 1px dotted; PADDING-TOP: 0.5em"><p>error 10 at 0 depth lookup:certificate has expired.<br />
证书已经过期。<br />
error 18 at 0 depth lookup:self signed certificate.<br />
除非有例外，否则，OpenSSL不会校验一个自签名的证书。</p></blockquote>
<p><strong>2、有哪些证书发行者是OpenSSL认可的</strong><br />
当在OpenSSL安装到系统中时，会配置一个“Directory for OpenSSL files”目录（编译时，通过&#8211;openssldir参数指定）。该目录存放有系统相信的证书发行者。可以使用下面的命令得到：（以红旗DC Server 5.0为例）</p>
<p style="MARGIN: 1em 1em 0pt; FONT-WEIGHT: bold">QUOTE:</p>
<blockquote style="BORDER-BOTTOM: #dddddd 1px dotted; BORDER-LEFT: #dddddd 1px dotted; PADDING-BOTTOM: 0.5em; LINE-HEIGHT: 1.8em; MARGIN: 0pt 1em 1em; PADDING-LEFT: 0.5em; PADDING-RIGHT: 0.5em; BORDER-TOP: #dddddd 1px dotted; BORDER-RIGHT: #dddddd 1px dotted; PADDING-TOP: 0.5em"><p>$ openssl version -d<br />
OPENSSLDIR: &#8220;/usr/share/ssl&#8221;</p></blockquote>
<p>在certs的目录和子目录中，你发现一到三种类型的文件：<br />
cert.pem 一个大文件，是像VerSign和Thawte的机构通过的证书；<br />
在certs子目录，有些小文件，是CA的；<br />
一些比较模糊的文件，有类似052eae11.0的文件名，并链接向.pem文件的。这些文件的第一部分实际上是基于指向.pem文件的hash值，而文件的扩展名意义不大，因为它理论上可以由不同的证书来创建咯。<br />
例如在我的Gentoo系统，有个f73e89fd.0的文件，其指向vsignss.pem，就有：</p>
<p style="MARGIN: 1em 1em 0pt; FONT-WEIGHT: bold">QUOTE:</p>
<blockquote style="BORDER-BOTTOM: #dddddd 1px dotted; BORDER-LEFT: #dddddd 1px dotted; PADDING-BOTTOM: 0.5em; LINE-HEIGHT: 1.8em; MARGIN: 0pt 1em 1em; PADDING-LEFT: 0.5em; PADDING-RIGHT: 0.5em; BORDER-TOP: #dddddd 1px dotted; BORDER-RIGHT: #dddddd 1px dotted; PADDING-TOP: 0.5em"><p>$ openssl x509 -noout -hash -in vsignss.pem<br />
f73e89fd</p></blockquote>
<p>当一个程序处理一个远程的证书，它将检查cert.pem是否存在，不存在这创建hash值文件，存在，则校验该证书。<br />
<strong>3、如何让OpenSSL任何和校验一个证书</strong><br />
把文件放到certs目录，并创建hash值文件，下面的脚本做到这一点：</p>
<p style="MARGIN: 1em 1em 0pt; FONT-WEIGHT: bold">QUOTE:</p>
<blockquote style="BORDER-BOTTOM: #dddddd 1px dotted; BORDER-LEFT: #dddddd 1px dotted; PADDING-BOTTOM: 0.5em; LINE-HEIGHT: 1.8em; MARGIN: 0pt 1em 1em; PADDING-LEFT: 0.5em; PADDING-RIGHT: 0.5em; BORDER-TOP: #dddddd 1px dotted; BORDER-RIGHT: #dddddd 1px dotted; PADDING-TOP: 0.5em"><p>#!/bin/sh<br />
#<br />
# usage: certlink.sh filename [filename ...]</p>
<p>for CERTFILE in $*; do<br />
  # make sure file exists and is a valid cert<br />
  test -f &#8220;$CERTFILE&#8221; || continue<br />
  HASH=$(openssl x509 -noout -hash -in &#8220;$CERTFILE&#8221;)<br />
  test -n &#8220;$HASH&#8221; || continue</p>
<p>  # use lowest available iterator for symlink<br />
  for ITER in 0 1 2 3 4 5 6 7 8 9; do<br />
    test -f &#8220;${HASH}.${ITER}&#8221; &amp;&amp; continue<br />
    ln -s &#8220;$CERTFILE&#8221; &#8220;${HASH}.${ITER}&#8221;<br />
    test -L &#8220;${HASH}.${ITER}&#8221; &amp;&amp; break<br />
  done<br />
done</p></blockquote>
<p><strong><span style="color: #4169e1;">六、客户端和服务端的命令</span></strong><br />
s_client和s_server选项提供一个方法执行SSL的客户端和服务端。<br />
<strong>1、如何连接一个安全的SMTP服务端</strong><br />
你可以使用s_client选项来连接一个SSL SMTP服务端。安全的SMTP使用3个端口：25（TLS），465（SSL），587（TLS）。0.9.7版本后，openssl可以通过 -starttls来和smtp服务端通讯：</p>
<p style="MARGIN: 1em 1em 0pt; FONT-WEIGHT: bold">QUOTE:</p>
<blockquote style="BORDER-BOTTOM: #dddddd 1px dotted; BORDER-LEFT: #dddddd 1px dotted; PADDING-BOTTOM: 0.5em; LINE-HEIGHT: 1.8em; MARGIN: 0pt 1em 1em; PADDING-LEFT: 0.5em; PADDING-RIGHT: 0.5em; BORDER-TOP: #dddddd 1px dotted; BORDER-RIGHT: #dddddd 1px dotted; PADDING-TOP: 0.5em"><p># port 25/TLS; use same syntax for port 587<br />
openssl s_client -connect remote.host:25 -starttls smtp<br />
# port 465/SSL<br />
openssl s_client -connect remote.host:465</p></blockquote>
<p>大部分的邮件代理不区分&lt;LF&gt;或&lt;CRLF&gt;，但Qmail例外，所以，对于Qmail，可以这样：</p>
<p style="MARGIN: 1em 1em 0pt; FONT-WEIGHT: bold">CODE:</p>
<p><code style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 0.5em; MARGIN: 0pt 1em 1em; PADDING-LEFT: 0.5em; PADDING-RIGHT: 0.5em; DISPLAY: block; FONT: 12px/1.8em Courier,monospace; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 0.5em">openssl s_client -connect remote.host:25 -crlf -starttls smtp</code><strong>2、如何连接其他安全服务端</strong><br />
连接到不同的，但均使用SSL的服务端是相同的：</p>
<p style="MARGIN: 1em 1em 0pt; FONT-WEIGHT: bold">QUOTE:</p>
<blockquote style="BORDER-BOTTOM: #dddddd 1px dotted; BORDER-LEFT: #dddddd 1px dotted; PADDING-BOTTOM: 0.5em; LINE-HEIGHT: 1.8em; MARGIN: 0pt 1em 1em; PADDING-LEFT: 0.5em; PADDING-RIGHT: 0.5em; BORDER-TOP: #dddddd 1px dotted; BORDER-RIGHT: #dddddd 1px dotted; PADDING-TOP: 0.5em"><p># https: HTTP over SSL<br />
openssl s_client -connect remote.host:443<br />
# ldaps: LDAP over SSL<br />
openssl s_client -connect remote.host:636<br />
# imaps: IMAP over SSL<br />
openssl s_client -connect remote.host:993<br />
# pop3s: POP-3 over SSL<br />
openssl s_client -connect remote.host:995</p></blockquote>
<p><strong>3、如何使用命令行建立一个 SSL server</strong><br />
s_server可以实现这个目的。但更好的办法，是使用Stunnel代替：</p>
<p style="MARGIN: 1em 1em 0pt; FONT-WEIGHT: bold">QUOTE:</p>
<blockquote style="BORDER-BOTTOM: #dddddd 1px dotted; BORDER-LEFT: #dddddd 1px dotted; PADDING-BOTTOM: 0.5em; LINE-HEIGHT: 1.8em; MARGIN: 0pt 1em 1em; PADDING-LEFT: 0.5em; PADDING-RIGHT: 0.5em; BORDER-TOP: #dddddd 1px dotted; BORDER-RIGHT: #dddddd 1px dotted; PADDING-TOP: 0.5em"><p># -www选项将返回一个HTML格式的页面给客户端<br />
openssl s_server -cert mycert.pem -www<br />
# -WWW选项模拟一个简单的web server，而使用当前目录的信息来返回给客户端。<br />
# 在这个例子中，我们指定443端口代替默认的4433端口<br />
openssl s_server -accept 443 -cert mycert.pem -WWW</p></blockquote>
<p><strong><span style="color: #4169e1;">七、dgst选项</span></strong><br />
<strong>1、如果创建一个文件的MD5或SHA1摘要</strong><br />
# MD5 digest<br />
openssl dgst -md5 filename<br />
# SHA1 digest<br />
openssl dgst -sha1 filename<br />
其结果和md5sum、sha1sum的结果是相同的。<br />
<strong>2、签名</strong><br />
如果你希望使用digest，实现没有你的私钥而不能修改文件的目的。下面的例子使用SHA1实现：</p>
<p style="MARGIN: 1em 1em 0pt; FONT-WEIGHT: bold">QUOTE:</p>
<blockquote style="BORDER-BOTTOM: #dddddd 1px dotted; BORDER-LEFT: #dddddd 1px dotted; PADDING-BOTTOM: 0.5em; LINE-HEIGHT: 1.8em; MARGIN: 0pt 1em 1em; PADDING-LEFT: 0.5em; PADDING-RIGHT: 0.5em; BORDER-TOP: #dddddd 1px dotted; BORDER-RIGHT: #dddddd 1px dotted; PADDING-TOP: 0.5em"><p># signed digest will be foo-1.23.tar.gz.sha1<br />
openssl dgst -sha1 \<br />
  -sign mykey.pem<br />
  -out foo-1.23.tar.gz.sha1 \<br />
  foo-1.23.tar.gz</p></blockquote>
<p>而foo-1.23.tar.gz.sha1 就是foo-1.23.tar.gz的签名信息公钥。<br />
<strong>3、校验签名</strong><br />
要校验签名，需要有签名人的公钥：</p>
<p style="MARGIN: 1em 1em 0pt; FONT-WEIGHT: bold">QUOTE:</p>
<blockquote style="BORDER-BOTTOM: #dddddd 1px dotted; BORDER-LEFT: #dddddd 1px dotted; PADDING-BOTTOM: 0.5em; LINE-HEIGHT: 1.8em; MARGIN: 0pt 1em 1em; PADDING-LEFT: 0.5em; PADDING-RIGHT: 0.5em; BORDER-TOP: #dddddd 1px dotted; BORDER-RIGHT: #dddddd 1px dotted; PADDING-TOP: 0.5em"><p># to verify foo-1.23.tar.gz using foo-1.23.tar.gz.sha1<br />
# and pubkey.pem<br />
openssl dgst -sha1 \<br />
  -verify pubkey.pem \<br />
  -signature foo-1.23.tar.gz.sha1 \<br />
  foo-1.23.tar.gz</p></blockquote>
<p><strong>4、创建Apache digest password entry</strong><br />
Apache使用特殊的密码格式，而使用htdigest组件，仅输出到文件，而非标准输出。当对于远端用户，它比较方便用户在他们信任的机器上创建密码。下面的脚本模拟htdigest的输出，并显示到标准输出：</p>
<p style="MARGIN: 1em 1em 0pt; FONT-WEIGHT: bold">QUOTE:</p>
<blockquote style="BORDER-BOTTOM: #dddddd 1px dotted; BORDER-LEFT: #dddddd 1px dotted; PADDING-BOTTOM: 0.5em; LINE-HEIGHT: 1.8em; MARGIN: 0pt 1em 1em; PADDING-LEFT: 0.5em; PADDING-RIGHT: 0.5em; BORDER-TOP: #dddddd 1px dotted; BORDER-RIGHT: #dddddd 1px dotted; PADDING-TOP: 0.5em"><p>#!/bin/bash</p>
<p>echo &#8220;Create an Apache-friendly Digest Password Entry&#8221;<br />
echo &#8220;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;&#8221;</p>
<p># get user input, disabling tty echoing for password<br />
read -p &#8220;Enter username: &#8221; UNAME<br />
read -p &#8220;Enter Apache AuthName: &#8221; AUTHNAME<br />
read -s -p &#8220;Enter password: &#8221; PWORD; echo</p>
<p>printf &#8220;\n%s:%s:%s\n&#8221; \<br />
  &#8221;$UNAME&#8221; \<br />
  &#8221;$AUTHNAME&#8221; \<br />
  $(printf &#8220;${UNAME}:${AUTHNAME}:${PWORD}&#8221; | openssl dgst -md5)</p></blockquote>
<p><strong>5、其他可以使用的digest类型</strong><br />
通过下面的命令可以得到所有的列表：</p>
<p style="MARGIN: 1em 1em 0pt; FONT-WEIGHT: bold">CODE:</p>
<p><code style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 0.5em; MARGIN: 0pt 1em 1em; PADDING-LEFT: 0.5em; PADDING-RIGHT: 0.5em; DISPLAY: block; FONT: 12px/1.8em Courier,monospace; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 0.5em">openssl list-message-digest-commands</code>[newpage]<br />
<strong><span style="color: #4169e1;">七、加密和解密</span></strong><br />
<strong>1、使用base64编码</strong></p>
<p style="MARGIN: 1em 1em 0pt; FONT-WEIGHT: bold">QUOTE:</p>
<blockquote style="BORDER-BOTTOM: #dddddd 1px dotted; BORDER-LEFT: #dddddd 1px dotted; PADDING-BOTTOM: 0.5em; LINE-HEIGHT: 1.8em; MARGIN: 0pt 1em 1em; PADDING-LEFT: 0.5em; PADDING-RIGHT: 0.5em; BORDER-TOP: #dddddd 1px dotted; BORDER-RIGHT: #dddddd 1px dotted; PADDING-TOP: 0.5em"><p># send encoded contents of file.txt to stdout<br />
openssl enc -base64 -in file.txt<br />
# same, but write contents to file.txt.enc<br />
openssl enc -base64 -in file.txt -out file.txt.enc</p></blockquote>
<p>命令行方式：</p>
<p style="MARGIN: 1em 1em 0pt; FONT-WEIGHT: bold">CODE:</p>
<p><code style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 0.5em; MARGIN: 0pt 1em 1em; PADDING-LEFT: 0.5em; PADDING-RIGHT: 0.5em; DISPLAY: block; FONT: 12px/1.8em Courier,monospace; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 0.5em">$ echo "encode me" | openssl enc -base64<br />
ZW5jb2RlIG1lCg==</code><span style="color: #ff4500;">※注意，echo默认会输出回车符，可使用-n参数屏蔽：</span></p>
<p style="MARGIN: 1em 1em 0pt; FONT-WEIGHT: bold">CODE:</p>
<p><code style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 0.5em; MARGIN: 0pt 1em 1em; PADDING-LEFT: 0.5em; PADDING-RIGHT: 0.5em; DISPLAY: block; FONT: 12px/1.8em Courier,monospace; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 0.5em">$ echo -n "encode me" | openssl enc -base64<br />
ZW5jb2RlIG1l</code>解密使用-d参数：</p>
<p style="MARGIN: 1em 1em 0pt; FONT-WEIGHT: bold">CODE:</p>
<p><code style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 0.5em; MARGIN: 0pt 1em 1em; PADDING-LEFT: 0.5em; PADDING-RIGHT: 0.5em; DISPLAY: block; FONT: 12px/1.8em Courier,monospace; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 0.5em">$ echo "ZW5jb2RlIG1lCg==" | openssl enc -base64 -d<br />
encode me</code><strong>2、如何简单地加密一个文件</strong><br />
使用cipher是一种比较简单的加密方式，下面的命令可以知道其支持的运算规则：</p>
<p style="MARGIN: 1em 1em 0pt; FONT-WEIGHT: bold">CODE:</p>
<p><code style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 0.5em; MARGIN: 0pt 1em 1em; PADDING-LEFT: 0.5em; PADDING-RIGHT: 0.5em; DISPLAY: block; FONT: 12px/1.8em Courier,monospace; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 0.5em">openssl list-cipher-commands</code>当你选择号一个运算规则后，需要决定是否使用base64编码，以使用可打印字符来代替二进制方式的显示（例如要发送邮件），就可以这样做：</p>
<p style="MARGIN: 1em 1em 0pt; FONT-WEIGHT: bold">QUOTE:</p>
<blockquote style="BORDER-BOTTOM: #dddddd 1px dotted; BORDER-LEFT: #dddddd 1px dotted; PADDING-BOTTOM: 0.5em; LINE-HEIGHT: 1.8em; MARGIN: 0pt 1em 1em; PADDING-LEFT: 0.5em; PADDING-RIGHT: 0.5em; BORDER-TOP: #dddddd 1px dotted; BORDER-RIGHT: #dddddd 1px dotted; PADDING-TOP: 0.5em"><p># encrypt file.txt to file.enc using 256-bit AES in CBC mode<br />
openssl enc -aes-256-cbc -salt -in file.txt -out file.enc<br />
# the same, only the output is base64 encoded for, e.g., e-mail<br />
openssl enc -aes-256-cbc <span style="color: #ff4500;">-a</span> -salt -in file.txt -out file.enc</p></blockquote>
<p>解密时，提供短语和对应的规则即可：</p>
<p style="MARGIN: 1em 1em 0pt; FONT-WEIGHT: bold">QUOTE:</p>
<blockquote style="BORDER-BOTTOM: #dddddd 1px dotted; BORDER-LEFT: #dddddd 1px dotted; PADDING-BOTTOM: 0.5em; LINE-HEIGHT: 1.8em; MARGIN: 0pt 1em 1em; PADDING-LEFT: 0.5em; PADDING-RIGHT: 0.5em; BORDER-TOP: #dddddd 1px dotted; BORDER-RIGHT: #dddddd 1px dotted; PADDING-TOP: 0.5em"><p># decrypt binary file.enc<br />
openssl enc -d -aes-256-cbc -in file.enc<br />
# decrypt base64-encoded version<br />
openssl enc -d -aes-256-cbc -a -in file.enc</p></blockquote>
<p>如果你连短语也不想手动输入，可以使用“PASS PHRASE ARGUMENTS”格式：</p>
<p style="MARGIN: 1em 1em 0pt; FONT-WEIGHT: bold">QUOTE:</p>
<blockquote style="BORDER-BOTTOM: #dddddd 1px dotted; BORDER-LEFT: #dddddd 1px dotted; PADDING-BOTTOM: 0.5em; LINE-HEIGHT: 1.8em; MARGIN: 0pt 1em 1em; PADDING-LEFT: 0.5em; PADDING-RIGHT: 0.5em; BORDER-TOP: #dddddd 1px dotted; BORDER-RIGHT: #dddddd 1px dotted; PADDING-TOP: 0.5em"><p># provide password on command line<br />
openssl enc -aes-256-cbc -salt -in file.txt \<br />
  -out file.enc -pass pass:mySillyPassword<br />
# provide password in a file<br />
openssl enc -aes-256-cbc -salt -in file.txt \<br />
  -out file.enc -pass file:/path/to/secret/password.txt</p></blockquote>
<p><strong><span style="color: #4169e1;">八、错误</span></strong><br />
如果你从日志中发现一些SSL的内容错误信息，例如：<br />
sshd[31784]: error: RSA_public_decrypt failed: error:0407006A:lib(4):func(112):reason(106)<br />
sshd[770]: error: RSA_public_decrypt failed: error:0407006A:lib(4):func(112):reason(106)<br />
你应该把error和lib之间的代码提取出来，并查询：<br />
$ openssl errstr 0407006A<br />
error:0407006A:rsa routines:RSA_padding_check_PKCS1_type_1:block type is not 01<br />
这样，再从manual里面去搜索信息，能比较好的解决问题。</p>
<p><strong><span style="color: #4169e1;">九、密钥</span></strong><br />
<strong>1、如果创建一个RSA密钥</strong><br />
使用genrsa选项：</p>
<p style="MARGIN: 1em 1em 0pt; FONT-WEIGHT: bold">QUOTE:</p>
<blockquote style="BORDER-BOTTOM: #dddddd 1px dotted; BORDER-LEFT: #dddddd 1px dotted; PADDING-BOTTOM: 0.5em; LINE-HEIGHT: 1.8em; MARGIN: 0pt 1em 1em; PADDING-LEFT: 0.5em; PADDING-RIGHT: 0.5em; BORDER-TOP: #dddddd 1px dotted; BORDER-RIGHT: #dddddd 1px dotted; PADDING-TOP: 0.5em"><p># default 512-bit key, sent to standard output<br />
openssl genrsa<br />
# 1024-bit key, saved to file named mykey.pem<br />
openssl genrsa -out mykey.pem 1024<br />
# same as above, but encrypted with a passphrase<br />
openssl genrsa -des3 -out mykey.pem 1024</p></blockquote>
<p><strong>2、如何创建一个RSA公钥</strong><br />
使用rsa选项，可以从私钥创建公钥：<br />
openssl rsa -in mykey.pem -pubout<br />
<strong>3、如果创建一个DSA密钥</strong><br />
创建DSA密钥需要parameter file，而且验证比RSA要慢，所以使用范围没有RSA广泛。<br />
如果你想创建一个单一的RSA密钥，可以：</p>
<p style="MARGIN: 1em 1em 0pt; FONT-WEIGHT: bold">QUOTE:</p>
<blockquote style="BORDER-BOTTOM: #dddddd 1px dotted; BORDER-LEFT: #dddddd 1px dotted; PADDING-BOTTOM: 0.5em; LINE-HEIGHT: 1.8em; MARGIN: 0pt 1em 1em; PADDING-LEFT: 0.5em; PADDING-RIGHT: 0.5em; BORDER-TOP: #dddddd 1px dotted; BORDER-RIGHT: #dddddd 1px dotted; PADDING-TOP: 0.5em"><p># key will be called dsakey.pem<br />
openssl dsaparam -noout -out dsakey.pem -genkey 1024</p></blockquote>
<p>另一方面，如果你希望多个DSA密钥共享一个parameter file，可以这样：</p>
<p style="MARGIN: 1em 1em 0pt; FONT-WEIGHT: bold">QUOTE:</p>
<blockquote style="BORDER-BOTTOM: #dddddd 1px dotted; BORDER-LEFT: #dddddd 1px dotted; PADDING-BOTTOM: 0.5em; LINE-HEIGHT: 1.8em; MARGIN: 0pt 1em 1em; PADDING-LEFT: 0.5em; PADDING-RIGHT: 0.5em; BORDER-TOP: #dddddd 1px dotted; BORDER-RIGHT: #dddddd 1px dotted; PADDING-TOP: 0.5em"><p># create parameters in dsaparam.pem<br />
openssl dsaparam -out dsaparam.pem 1024<br />
# create first key<br />
openssl gendsa -out key1.pem dsaparam.pem<br />
# and second &#8230;<br />
openssl gendsa -out key2.pem dsaparam.pem</p></blockquote>
<p><strong>4、创建elliptic curve key</strong><br />
OpenSSL 0.9.8以上的版本才支持elliptic curve key：</p>
<p style="MARGIN: 1em 1em 0pt; FONT-WEIGHT: bold">CODE:</p>
<p><code style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 0.5em; MARGIN: 0pt 1em 1em; PADDING-LEFT: 0.5em; PADDING-RIGHT: 0.5em; DISPLAY: block; FONT: 12px/1.8em Courier,monospace; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 0.5em">openssl ecparam -out key.pem -name prime256v1 -genkey</code># -name 选型可以使用的参数，可通过下面的命令获得：</p>
<p style="MARGIN: 1em 1em 0pt; FONT-WEIGHT: bold">CODE:</p>
<p><code style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 0.5em; MARGIN: 0pt 1em 1em; PADDING-LEFT: 0.5em; PADDING-RIGHT: 0.5em; DISPLAY: block; FONT: 12px/1.8em Courier,monospace; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 0.5em">openssl ecparam -list_curves</code><strong>5、如何从一个密钥移除passphrase（短语）</strong><br />
依赖于你使用rsa或dsa方式，使用不同的处理方法。<br />
假设你创建的RSA密钥，并放在单独的key.pem文件，那么下面的命令后，你就可以得到一个没有短语加密，但相同编码的RSA密钥 newkey.pem</p>
<p style="MARGIN: 1em 1em 0pt; FONT-WEIGHT: bold">QUOTE:</p>
<blockquote style="BORDER-BOTTOM: #dddddd 1px dotted; BORDER-LEFT: #dddddd 1px dotted; PADDING-BOTTOM: 0.5em; LINE-HEIGHT: 1.8em; MARGIN: 0pt 1em 1em; PADDING-LEFT: 0.5em; PADDING-RIGHT: 0.5em; BORDER-TOP: #dddddd 1px dotted; BORDER-RIGHT: #dddddd 1px dotted; PADDING-TOP: 0.5em"><p># you&#8217;ll be prompted for your passphrase one last time<br />
openssl rsa -in key.pem -out newkey.pem</p></blockquote>
<p>通常，私钥和公钥可以放在同一个文件。假设叫mycert.pem。通过下面的步骤，也可以得到没有短语的文件newcert.pem</p>
<p style="MARGIN: 1em 1em 0pt; FONT-WEIGHT: bold">QUOTE:</p>
<blockquote style="BORDER-BOTTOM: #dddddd 1px dotted; BORDER-LEFT: #dddddd 1px dotted; PADDING-BOTTOM: 0.5em; LINE-HEIGHT: 1.8em; MARGIN: 0pt 1em 1em; PADDING-LEFT: 0.5em; PADDING-RIGHT: 0.5em; BORDER-TOP: #dddddd 1px dotted; BORDER-RIGHT: #dddddd 1px dotted; PADDING-TOP: 0.5em"><p># you&#8217;ll need to type your passphrase once more<br />
openssl rsa -in mycert.pem -out newcert.pem<br />
openssl x509 -in mycert.pem &gt;&gt;newcert.pem</p></blockquote>
<p>[newpage]<br />
<strong><span style="color: #4169e1;">十、Password hashes</span></strong><br />
使用passwd选项，你可以得到一个类似/etc/passwd或者/etc/shadow格式的密码。<br />
1、创建一个crypt-style密码</p>
<p style="MARGIN: 1em 1em 0pt; FONT-WEIGHT: bold">QUOTE:</p>
<blockquote style="BORDER-BOTTOM: #dddddd 1px dotted; BORDER-LEFT: #dddddd 1px dotted; PADDING-BOTTOM: 0.5em; LINE-HEIGHT: 1.8em; MARGIN: 0pt 1em 1em; PADDING-LEFT: 0.5em; PADDING-RIGHT: 0.5em; BORDER-TOP: #dddddd 1px dotted; BORDER-RIGHT: #dddddd 1px dotted; PADDING-TOP: 0.5em"><p>$ openssl passwd MySecret<br />
8E4vqBR4UOYF</p></blockquote>
<p>如果知道已经存在密码的“salt”，可以复制其hash：</p>
<p style="MARGIN: 1em 1em 0pt; FONT-WEIGHT: bold">QUOTE:</p>
<blockquote style="BORDER-BOTTOM: #dddddd 1px dotted; BORDER-LEFT: #dddddd 1px dotted; PADDING-BOTTOM: 0.5em; LINE-HEIGHT: 1.8em; MARGIN: 0pt 1em 1em; PADDING-LEFT: 0.5em; PADDING-RIGHT: 0.5em; BORDER-TOP: #dddddd 1px dotted; BORDER-RIGHT: #dddddd 1px dotted; PADDING-TOP: 0.5em"><p>$ openssl passwd -salt 8E MySecret<br />
8E4vqBR4UOYF.</p></blockquote>
<p>否则，即使相同的密码，因每次的hash不同，结果也不同的。<br />
2、创建一个shadow-style的密码<br />
新的Unix系统（包括linux），都使用安全的MD5-based来作为salt，可以这样产生类似的密码：</p>
<p style="MARGIN: 1em 1em 0pt; FONT-WEIGHT: bold">QUOTE:</p>
<blockquote style="BORDER-BOTTOM: #dddddd 1px dotted; BORDER-LEFT: #dddddd 1px dotted; PADDING-BOTTOM: 0.5em; LINE-HEIGHT: 1.8em; MARGIN: 0pt 1em 1em; PADDING-LEFT: 0.5em; PADDING-RIGHT: 0.5em; BORDER-TOP: #dddddd 1px dotted; BORDER-RIGHT: #dddddd 1px dotted; PADDING-TOP: 0.5em"><p>$ openssl passwd -1 MySecret<br />
$1$HkrAilcM$Jy3vYQc8UiEXfTLRrlSpD.</p></blockquote>
<p>而slat在二到三$符号之间，所以有：</p>
<p style="MARGIN: 1em 1em 0pt; FONT-WEIGHT: bold">QUOTE:</p>
<blockquote style="BORDER-BOTTOM: #dddddd 1px dotted; BORDER-LEFT: #dddddd 1px dotted; PADDING-BOTTOM: 0.5em; LINE-HEIGHT: 1.8em; MARGIN: 0pt 1em 1em; PADDING-LEFT: 0.5em; PADDING-RIGHT: 0.5em; BORDER-TOP: #dddddd 1px dotted; BORDER-RIGHT: #dddddd 1px dotted; PADDING-TOP: 0.5em"><p>$ openssl passwd -1 -salt HkrAilcM MySecret<br />
$1$HkrAilcM$Jy3vYQc8UiEXfTLRrlSpD.</p></blockquote>
<p><strong><span style="color: #4169e1;">十一、Prime numbers（素数）</span></strong><br />
从0.9.7e之后，prime选项被加入到openssl库中。<br />
1、如何判断一个数字是否prime<br />
使用prime选项即可。需要注意的是，返回的结果是十六进制，而非十进制形式的。</p>
<p style="MARGIN: 1em 1em 0pt; FONT-WEIGHT: bold">QUOTE:</p>
<blockquote style="BORDER-BOTTOM: #dddddd 1px dotted; BORDER-LEFT: #dddddd 1px dotted; PADDING-BOTTOM: 0.5em; LINE-HEIGHT: 1.8em; MARGIN: 0pt 1em 1em; PADDING-LEFT: 0.5em; PADDING-RIGHT: 0.5em; BORDER-TOP: #dddddd 1px dotted; BORDER-RIGHT: #dddddd 1px dotted; PADDING-TOP: 0.5em"><p>$ openssl prime 119054759245460753<br />
1A6F7AC39A53511 is not prime<br />
$ openssl prime -hex 2f<br />
2F is prime</p></blockquote>
<p>2、如何创建一组prime numbers</p>
<p style="MARGIN: 1em 1em 0pt; FONT-WEIGHT: bold">QUOTE:</p>
<blockquote style="BORDER-BOTTOM: #dddddd 1px dotted; BORDER-LEFT: #dddddd 1px dotted; PADDING-BOTTOM: 0.5em; LINE-HEIGHT: 1.8em; MARGIN: 0pt 1em 1em; PADDING-LEFT: 0.5em; PADDING-RIGHT: 0.5em; BORDER-TOP: #dddddd 1px dotted; BORDER-RIGHT: #dddddd 1px dotted; PADDING-TOP: 0.5em"><p># define start and ending points<br />
AQUO=10000<br />
ADQUEM=10100<br />
for N in $(seq $AQUO $ADQUEM); do<br />
  # use bc to convert hex to decimal<br />
  openssl prime $N | awk &#8216;/is prime/ {print &#8220;ibase=16;&#8221;$1}&#8217; | bc<br />
done</p></blockquote>
<p><strong><span style="color: #4169e1;">十二、随机数</span></strong><br />
使用rand选项可以得到二进制或base64编码后的随机数：</p>
<p style="MARGIN: 1em 1em 0pt; FONT-WEIGHT: bold">QUOTE:</p>
<blockquote style="BORDER-BOTTOM: #dddddd 1px dotted; BORDER-LEFT: #dddddd 1px dotted; PADDING-BOTTOM: 0.5em; LINE-HEIGHT: 1.8em; MARGIN: 0pt 1em 1em; PADDING-LEFT: 0.5em; PADDING-RIGHT: 0.5em; BORDER-TOP: #dddddd 1px dotted; BORDER-RIGHT: #dddddd 1px dotted; PADDING-TOP: 0.5em"><p># write 128 random bytes of base64-encoded data to stdout<br />
openssl rand -base64 128<br />
# write 1024 bytes of binary random data to a file<br />
openssl rand -out random-data.bin 1024<br />
# seed openssl with semi-random bytes from browser cache<br />
cd $(find ~/.mozilla/firefox -type d -name Cache)<br />
openssl rand -rand $(find . -type f -printf &#8216;%f:&#8217;) -base64 1024</p></blockquote>
<p>从 /dev/urandom可以得到类似的种子：</p>
<p style="MARGIN: 1em 1em 0pt; FONT-WEIGHT: bold">QUOTE:</p>
<blockquote style="BORDER-BOTTOM: #dddddd 1px dotted; BORDER-LEFT: #dddddd 1px dotted; PADDING-BOTTOM: 0.5em; LINE-HEIGHT: 1.8em; MARGIN: 0pt 1em 1em; PADDING-LEFT: 0.5em; PADDING-RIGHT: 0.5em; BORDER-TOP: #dddddd 1px dotted; BORDER-RIGHT: #dddddd 1px dotted; PADDING-TOP: 0.5em"><p># get 32 bytes from /dev/urandom and base64 encode them<br />
head -c 32 /dev/urandom | openssl enc -base64</p></blockquote>
<p><strong><span style="color: #4169e1;">十三、S/MIME</span></strong><br />
S/MIME是发送和接收安全MIME的一个标准，常用于email中。通过OpenSSL的smime选项，可以提供命令行的S/MIME服务。<br />
<strong>1、如何校验一个已经签名的S/MIME信息</strong><br />
把收到的信息保存到msg.txt文件即可：</p>
<p style="MARGIN: 1em 1em 0pt; FONT-WEIGHT: bold">CODE:</p>
<p><code style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 0.5em; MARGIN: 0pt 1em 1em; PADDING-LEFT: 0.5em; PADDING-RIGHT: 0.5em; DISPLAY: block; FONT: 12px/1.8em Courier,monospace; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 0.5em">openssl smime -verify -in msg.txt</code>如果发送人的证书被OpenSSL接受的，可以得到：</p>
<p style="MARGIN: 1em 1em 0pt; FONT-WEIGHT: bold">QUOTE:</p>
<blockquote style="BORDER-BOTTOM: #dddddd 1px dotted; BORDER-LEFT: #dddddd 1px dotted; PADDING-BOTTOM: 0.5em; LINE-HEIGHT: 1.8em; MARGIN: 0pt 1em 1em; PADDING-LEFT: 0.5em; PADDING-RIGHT: 0.5em; BORDER-TOP: #dddddd 1px dotted; BORDER-RIGHT: #dddddd 1px dotted; PADDING-TOP: 0.5em"><p>Verification successful.</p></blockquote>
<p>而如果内容被非认证架构修改，会得到错误信息：</p>
<p style="MARGIN: 1em 1em 0pt; FONT-WEIGHT: bold">QUOTE:</p>
<blockquote style="BORDER-BOTTOM: #dddddd 1px dotted; BORDER-LEFT: #dddddd 1px dotted; PADDING-BOTTOM: 0.5em; LINE-HEIGHT: 1.8em; MARGIN: 0pt 1em 1em; PADDING-LEFT: 0.5em; PADDING-RIGHT: 0.5em; BORDER-TOP: #dddddd 1px dotted; BORDER-RIGHT: #dddddd 1px dotted; PADDING-TOP: 0.5em"><p>Verification failure<br />
23016:error:21071065:PKCS7 routines:PKCS7_signatureVerify:digest<br />
failure:pk7_doit.c:804:<br />
23016:error:21075069:PKCS7 routines:PKCS7_verify:signature<br />
failure:pk7_smime.c:265:</p></blockquote>
<p>而如果发送人的证书不在OpenSSL的识别范围内，也会出错：</p>
<p style="MARGIN: 1em 1em 0pt; FONT-WEIGHT: bold">QUOTE:</p>
<blockquote style="BORDER-BOTTOM: #dddddd 1px dotted; BORDER-LEFT: #dddddd 1px dotted; PADDING-BOTTOM: 0.5em; LINE-HEIGHT: 1.8em; MARGIN: 0pt 1em 1em; PADDING-LEFT: 0.5em; PADDING-RIGHT: 0.5em; BORDER-TOP: #dddddd 1px dotted; BORDER-RIGHT: #dddddd 1px dotted; PADDING-TOP: 0.5em"><p>Verification failure<br />
9544:error:21075075:PKCS7 routines:PKCS7_verify:certificate verify<br />
error:pk7_smime.c:222:Verify error:self signed certificate</p></blockquote>
<p>大部分的邮件客户端，会随信息发送一个公共证书，从命令行也可以看到证书的信息：</p>
<p style="MARGIN: 1em 1em 0pt; FONT-WEIGHT: bold">CODE:</p>
<p><code style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 0.5em; MARGIN: 0pt 1em 1em; PADDING-LEFT: 0.5em; PADDING-RIGHT: 0.5em; DISPLAY: block; FONT: 12px/1.8em Courier,monospace; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 0.5em">openssl smime -pk7out -in msg.txt | \<br />
openssl pkcs7 -text -noout -print_certs</code>通过下面的命令，得到证书的copy</p>
<p style="MARGIN: 1em 1em 0pt; FONT-WEIGHT: bold">CODE:</p>
<p><code style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 0.5em; MARGIN: 0pt 1em 1em; PADDING-LEFT: 0.5em; PADDING-RIGHT: 0.5em; DISPLAY: block; FONT: 12px/1.8em Courier,monospace; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 0.5em">openssl smime -pk7out -in msg.txt -out her-cert.pem</code>这样，你就可以再次利用它来验证</p>
<p style="MARGIN: 1em 1em 0pt; FONT-WEIGHT: bold">CODE:</p>
<p><code style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 0.5em; MARGIN: 0pt 1em 1em; PADDING-LEFT: 0.5em; PADDING-RIGHT: 0.5em; DISPLAY: block; FONT: 12px/1.8em Courier,monospace; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 0.5em">openssl smime -verify -in msg.txt -CAfile /path/to/her-cert.pem</code><strong>2、如何加密一个S/MIME信息</strong><br />
假设某人把她的公共证书发给你，并且要求你加密这些信息才给它。你应保存她的her-cert.pem文件。然后再reply。<br />
为获得the default—though fairly weak—RC2-40 encryption，你应该告诉openssl信息和证书的位置</p>
<p style="MARGIN: 1em 1em 0pt; FONT-WEIGHT: bold">CODE:</p>
<p><code style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 0.5em; MARGIN: 0pt 1em 1em; PADDING-LEFT: 0.5em; PADDING-RIGHT: 0.5em; DISPLAY: block; FONT: 12px/1.8em Courier,monospace; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 0.5em">openssl smime her-cert.pem -encrypt -in my-message.txt</code>如果你确认对方有robust SSL toolkit，你可以指定一个类似DES的运算法则来加密</p>
<p style="MARGIN: 1em 1em 0pt; FONT-WEIGHT: bold">CODE:</p>
<p><code style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 0.5em; MARGIN: 0pt 1em 1em; PADDING-LEFT: 0.5em; PADDING-RIGHT: 0.5em; DISPLAY: block; FONT: 12px/1.8em Courier,monospace; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 0.5em">openssl smime her-cert.pem -encrypt -des3 -in my-message.txt</code>当使用sendmail时，可以一并来实现</p>
<p style="MARGIN: 1em 1em 0pt; FONT-WEIGHT: bold">CODE:</p>
<p><code style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 0.5em; MARGIN: 0pt 1em 1em; PADDING-LEFT: 0.5em; PADDING-RIGHT: 0.5em; DISPLAY: block; FONT: 12px/1.8em Courier,monospace; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 0.5em">openssl smime her-cert.pem \<br />
  -encrypt \<br />
  -des3 \<br />
  -in my-message.txt \<br />
  -from 'Your Fullname &lt;you@youraddress.com&gt;' \<br />
  -to 'Her Fullname &lt;her@heraddress.com&gt;' \<br />
  -subject 'My encrypted reply' |\<br />
sendmail her@heraddress.com</code><strong>3、如何对S/MIME信息签名</strong><br />
如果你不想加密，而只是想签名，可以这样：</p>
<p style="MARGIN: 1em 1em 0pt; FONT-WEIGHT: bold">CODE:</p>
<p><code style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 0.5em; MARGIN: 0pt 1em 1em; PADDING-LEFT: 0.5em; PADDING-RIGHT: 0.5em; DISPLAY: block; FONT: 12px/1.8em Courier,monospace; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 0.5em">openssl smime \<br />
  -sign \<br />
  -signer /path/to/your-cert.pem \<br />
  -in my-message.txt \<br />
  -from 'Your Fullname &lt;you@youraddress.com&gt;' \<br />
  -to 'Her Fullname &lt;her@heraddress.com&gt;' \<br />
  -subject 'My signed reply' |\<br />
sendmail her@heraddress.com</code>唯一的区别，就是使用你自己的密钥和证书，而非发送者的证书咯。<span id="_marker"> </span><strong>1、如何知道我的OpenSSL运行版本</strong></p>
<p style="margin: 1em 1em 0pt; font-weight: bold;">QUOTE:</p>
<blockquote style="line-height: 1.8em; margin: 0pt 1em 1em; border: #dddddd 1px dotted; padding: 0.5em;"><p># openssl version<br />
OpenSSL 0.9.7a Feb 19 2003</p></blockquote>
<p>-a参数可以获得更详细的信息：</p>
<p style="margin: 1em 1em 0pt; font-weight: bold;">QUOTE:</p>
<blockquote style="line-height: 1.8em; margin: 0pt 1em 1em; border: #dddddd 1px dotted; padding: 0.5em;"><p># openssl version -a<br />
OpenSSL 0.9.7a Feb 19 2003<br />
built on: Tue Oct 31 02:10:29 EST 2006<br />
platform: linux-elf<br />
options:  bn(64,32) md2(int) rc4(idx,int) des(ptr,risc1,16,long) blowfish(idx)<br />
compiler: gcc -fPIC -DZLIB -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -DKRB5_MIT -DOPENSSL_NO_ASM -DOPENSSL_NO_IDEA -DOPENSSL_NO_MDC2 -DOPENSSL_NO_RC5 -DOPENSSL_NO_EC -I/usr/kerberos/include -DL_ENDIAN -DTERMIO -Wall -O2 -g -march=i386 -mcpu=i686 -Wa,&#8211;noexecstack<br />
OPENSSLDIR: &#8220;/usr/share/ssl&#8221;<br />
engines:  dynamic cswift chil atalla nuron ubsec aep ibmca sureware 4758cca</p></blockquote>
<p><strong>2、获取可用的命令列表</strong><br />
OpenSSL提供三个内置的选项命令组，而通过提供一个错误的参数，可以获得其帮助信息。（例如help、或-h）</p>
<p style="margin: 1em 1em 0pt; font-weight: bold;">QUOTE:</p>
<blockquote style="line-height: 1.8em; margin: 0pt 1em 1em; border: #dddddd 1px dotted; padding: 0.5em;"><p># openssl -h<br />
openssl:Error: &#8216;-h&#8217; is an invalid command.</p>
<p>Standard commands<br />
asn1parse      ca             ciphers        crl            crl2pkcs7<br />
dgst           dh             dhparam        dsa            dsaparam<br />
enc            engine         errstr         gendh          gendsa<br />
genrsa         nseq           ocsp           passwd         pkcs12<br />
pkcs7          pkcs8          rand           req            rsa<br />
rsautl         s_client       s_server       s_time         sess_id<br />
smime          speed          spkac          verify         version<br />
x509</p>
<p>Message Digest commands (see the `dgst&#8217; command for more details)<br />
md2            md4            md5            rmd160         sha<br />
sha1</p>
<p>Cipher commands (see the `enc&#8217; command for more details)<br />
aes-128-cbc    aes-128-ecb    aes-192-cbc    aes-192-ecb    aes-256-cbc<br />
aes-256-ecb    base64         bf             bf-cbc         bf-cfb<br />
bf-ecb         bf-ofb         cast           cast-cbc       cast5-cbc<br />
cast5-cfb      cast5-ecb      cast5-ofb      des            des-cbc<br />
des-cfb        des-ecb        des-ede        des-ede-cbc    des-ede-cfb<br />
des-ede-ofb    des-ede3       des-ede3-cbc   des-ede3-cfb   des-ede3-ofb<br />
des-ofb        des3           desx           rc2            rc2-40-cbc<br />
rc2-64-cbc     rc2-cbc        rc2-cfb        rc2-ecb        rc2-ofb<br />
rc4            rc4-40</p></blockquote>
<p>也可以获取某个命令组可用的参数：</p>
<p style="margin: 1em 1em 0pt; font-weight: bold;">QUOTE:</p>
<blockquote style="line-height: 1.8em; margin: 0pt 1em 1em; border: #dddddd 1px dotted; padding: 0.5em;"><p># openssl dgst -h<br />
unknown option &#8216;-h&#8217;<br />
options are<br />
-c              to output the digest with separating colons<br />
-d              to output debug info<br />
-hex            output as hex dump<br />
-binary         output in binary form<br />
-sign   file    sign digest using private key in file<br />
-verify file    verify a signature using public key in file<br />
-prverify file  verify a signature using private key in file<br />
-keyform arg    key file format (PEM or ENGINE)<br />
-signature file signature to verify<br />
-binary         output in binary form<br />
-engine e       use engine e, possibly a hardware device.<br />
-md5 to use the md5 message digest algorithm (default)<br />
-md4 to use the md4 message digest algorithm<br />
-md2 to use the md2 message digest algorithm<br />
-sha1 to use the sha1 message digest algorithm<br />
-sha to use the sha message digest algorithm<br />
-mdc2 to use the mdc2 message digest algorithm<br />
-ripemd160 to use the ripemd160 message digest algorithm</p></blockquote>
<p><strong>3、如何获取可用的密码（ciphers）列表</strong></p>
<p style="margin: 1em 1em 0pt; font-weight: bold;">QUOTE:</p>
<blockquote style="line-height: 1.8em; margin: 0pt 1em 1em; border: #dddddd 1px dotted; padding: 0.5em;"><p># 显示所有可用的密码（ciphers）列表<br />
openssl ciphers -v<br />
# 仅显示TLSv1版本的密码<br />
openssl ciphers -v -tls1<br />
# 仅显示密钥大于128bit的高强度密码方式<br />
openssl ciphers -v &#8216;HIGH&#8217;<br />
# 仅显示使用AES运算法则的高强度密码方式<br />
openssl ciphers -v &#8216;AES+HIGH&#8217;</p></blockquote>
<p><strong><span style="color: #4169e1;">三、性能测试</span></strong><br />
OpenSSL提供内置的性能测试组件，其通过speed选项，可以测试在一段时间内可以执行的操作数量，而不是测试固定数量操作的时间，这能确保即使是慢的系统，也不会花费过长的时间。<br />
<strong>1、如何进行性能测试</strong></p>
<p style="margin: 1em 1em 0pt; font-weight: bold;">QUOTE:</p>
<blockquote style="line-height: 1.8em; margin: 0pt 1em 1em; border: #dddddd 1px dotted; padding: 0.5em;"><p># 执行一个完整的性能测试<br />
openssl speed<br />
# 仅进行rsa的速度测试<br />
openssl speed rsa<br />
# 在一个SMP系统中，进行2路的rsa速度测试<br />
openssl speed rsa -multi 2</p></blockquote>
<p><strong>2、如何测试远程连接的性能</strong><br />
使用s_time运行你测试远程连接的性能（30sec）：</p>
<p style="margin: 1em 1em 0pt; font-weight: bold;">CODE:</p>
<p><code style="margin: 0pt 1em 1em; display: block; font: 12px/1.8em Courier,monospace; border: #cccccc 1px solid; padding: 0.5em;">openssl s_time -connect remote.host:443</code>除了简单的测试外，s_time也允许进行指定的测试项目：</p>
<p style="margin: 1em 1em 0pt; font-weight: bold;">QUOTE:</p>
<blockquote style="line-height: 1.8em; margin: 0pt 1em 1em; border: #dddddd 1px dotted; padding: 0.5em;"><p># 使用新的session接收远程的test.html页面<br />
openssl s_time -connect remote.host:443 -www /test.html -new<br />
# 类似的，仅使用SSL v3版本和高强度的加密<br />
openssl s_time \<br />
  -connect remote.host:443 -www /test.html -new \<br />
  -ssl3 -cipher HIGH<br />
# 对比多个加密规则在10秒内连接的性能情况<br />
IFS=&#8221;:&#8221;<br />
for c in $(openssl ciphers -ssl3 RSA); do<br />
  echo $c<br />
  openssl s_time -connect remote.host:443 \<br />
    -www / -new -time 10 -cipher $c 2&gt;&amp;1 | \<br />
    grep bytes<br />
  echo<br />
done</p></blockquote>
<p>如果你并没有SSL支持的Web服务器可以使用，你可以用s_server选项模拟：</p>
<p style="margin: 1em 1em 0pt; font-weight: bold;">QUOTE:</p>
<blockquote style="line-height: 1.8em; margin: 0pt 1em 1em; border: #dddddd 1px dotted; padding: 0.5em;"><p># 主机一，建立服务端（默认使用4433端口）<br />
openssl s_server -cert mycert.pem -www<br />
# 主机二，通过s_time连接到指定的4433端口进行测试<br />
openssl s_time -connect myhost:4433 -www / -new -ssl3</p></blockquote>
<p>[newpage]<br />
<strong><span style="color: #4169e1;">四、证书</span></strong><br />
<strong>1、如何创建一个self-signed证书</strong><br />
首先，你需要决定是否使用短语（passphrase）加密你的密钥。一方面，使用短语加密密钥可以更安全，可以即使密钥被盗也不能使用；但另一方面，这意味着在启动web或ldap服务前，你需要把短语保存到文件上，或者手动的输入。先以一个没有短语的密钥为例。<br />
下面的例子创建一个包含私钥和公钥的mycert.pem文件，该证书有效期为365日，而使用-nodes表示为不加密的密钥：</p>
<p style="margin: 1em 1em 0pt; font-weight: bold;">CODE:</p>
<p><code style="margin: 0pt 1em 1em; display: block; font: 12px/1.8em Courier,monospace; border: #cccccc 1px solid; padding: 0.5em;">openssl req \<br />
  -x509 -nodes -days 365 \<br />
  -newkey rsa:1024 -keyout mycert.pem -out mycert.pem</code>使用该命令，你将需要回答一连串的问题：Country Name, State, City等，特别是Common Name，是一个非常重要的区分信息。如果你的web服务器实际主机名是mybox.mydomain.com，而人们访问的是使用<a href="http://www.mydomain.com/" target="_blank">www.mydomain.com</a>来访问，那么你应该使用<a href="http://www.mydomain.com/" target="_blank">www.mydomain.com</a>来填写Common Name。<br />
使用-subj参数，可以更方便的填写这些信息：</p>
<p style="margin: 1em 1em 0pt; font-weight: bold;">CODE:</p>
<p><code style="margin: 0pt 1em 1em; display: block; font: 12px/1.8em Courier,monospace; border: #cccccc 1px solid; padding: 0.5em;">openssl req \<br />
  -x509 -nodes -days 365 \<br />
  -subj '/C=US/ST=Oregon/L=Portland/CN=www.madboa.com' \<br />
  -newkey rsa:1024 -keyout mycert.pem -out mycert.pem</code><strong>2、如何创建一个给 VeriSign的证书</strong><br />
当为类似VeriSign的机构生成一个证书是比较复杂的官僚过程。在创建证书前，需要提交所有必须的文书文件。同上面一样，你必须考虑是否使用短语来加密你的密钥。下面都是假设你不使用这种方式。而得到一个叫mykey.pem的私钥文件，和myreq.pem的认证请求文件：</p>
<p style="margin: 1em 1em 0pt; font-weight: bold;">CODE:</p>
<p><code style="margin: 0pt 1em 1em; display: block; font: 12px/1.8em Courier,monospace; border: #cccccc 1px solid; padding: 0.5em;">openssl req \<br />
  -new -newkey rsa:1024 -nodes \<br />
  -keyout mykey.pem -out myreq.pem</code>如果你已经有私钥，而希望通过它生成认证请求文件，可以这样：</p>
<p style="margin: 1em 1em 0pt; font-weight: bold;">CODE:</p>
<p><code style="margin: 0pt 1em 1em; display: block; font: 12px/1.8em Courier,monospace; border: #cccccc 1px solid; padding: 0.5em;">openssl req -new -key mykey.pem -out myreq.pem</code>类似的，你也可以一同在命令行中提交证书信息：</p>
<p style="margin: 1em 1em 0pt; font-weight: bold;">CODE:</p>
<p><code style="margin: 0pt 1em 1em; display: block; font: 12px/1.8em Courier,monospace; border: #cccccc 1px solid; padding: 0.5em;">openssl req \<br />
  -new -newkey rsa:1024 -nodes \<br />
  -subj '/CN=www.mydom.com/O=My Dom, Inc./C=US/ST=Oregon/L=Portland' \<br />
  -keyout mykey.pem -out myreq.pem</code>当处理类似VeriSign的机构，你需要特别留意，所提交的信息资料都必须正确无误。即使在Organization Name中的“and”和“&amp;”区别都会引起麻烦。当你提交证书请求前，应double check一次：</p>
<p style="margin: 1em 1em 0pt; font-weight: bold;">QUOTE:</p>
<blockquote style="line-height: 1.8em; margin: 0pt 1em 1em; border: #dddddd 1px dotted; padding: 0.5em;"><p># 校验签名<br />
openssl req -in myreq.pem -noout -verify -key mykey.pem<br />
# 检查信息<br />
openssl req -in myreq.pem -noout -text</p></blockquote>
<p>请把密钥文件存放在安全的地方。你需要它来使用VeriSign发给你的信息。然后，在VeriSign上提交证书请求即可。<br />
<strong>3、我如何测试一个新的证书</strong><br />
使用s_server选项是最简单的测试方法。下面的例子假设你的密钥和证书都放在mycert.pem中。<br />
首先，在测试端加载该证书，默认使用4433端口（可使用-accept选项修改）：</p>
<p style="margin: 1em 1em 0pt; font-weight: bold;">CODE:</p>
<p><code style="margin: 0pt 1em 1em; display: block; font: 12px/1.8em Courier,monospace; border: #cccccc 1px solid; padding: 0.5em;">openssl s_server -cert mycert.pem -www</code>如果加载顺利，那么，你使用浏览器访问https://yourserver:4433/，你应该可以看到一个使用不同密码和关于你连接状态信息的页面。而大部分的浏览器也允许你测试该正式的有效性。<br />
<strong>4、我如何重新得到一个远程的证书</strong><br />
如果你懂openssl和sed，可以通过下面的脚本实现：</p>
<p style="margin: 1em 1em 0pt; font-weight: bold;">QUOTE:</p>
<blockquote style="line-height: 1.8em; margin: 0pt 1em 1em; border: #dddddd 1px dotted; padding: 0.5em;"><p>#!/bin/sh<br />
#<br />
# usage: retrieve-cert.sh remote.host.name [port]<br />
#<br />
REMHOST=$1<br />
REMPORT=${2:-443}</p>
<p>echo |\<br />
openssl s_client -connect ${REMHOST}:${REMPORT} 2&gt;&amp;1 |\<br />
sed -ne &#8216;/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p&#8217;</p></blockquote>
<p><strong>5、如何从证书获得信息</strong><br />
一个SSL证书包括很多的信息，使用x509子命令，可以得到这些信息。下面的例子假设证书名称为：cert.pem。使用-text选项可以得到全部的信息：</p>
<p style="margin: 1em 1em 0pt; font-weight: bold;">CODE:</p>
<p><code style="margin: 0pt 1em 1em; display: block; font: 12px/1.8em Courier,monospace; border: #cccccc 1px solid; padding: 0.5em;">openssl x509 -text -in cert.pem</code>使用不同的参数，可以获得指定的数据：</p>
<p style="margin: 1em 1em 0pt; font-weight: bold;">QUOTE:</p>
<blockquote style="line-height: 1.8em; margin: 0pt 1em 1em; border: #dddddd 1px dotted; padding: 0.5em;"><p># who issued the cert?<br />
openssl x509 -noout -in cert.pem -issuer<br />
# to whom was it issued?<br />
openssl x509 -noout -in cert.pem -subject<br />
# for what dates is it valid?<br />
openssl x509 -noout -in cert.pem -dates<br />
# the above, all at once<br />
openssl x509 -noout -in cert.pem -issuer -subject -dates<br />
# what is its hash value?<br />
openssl x509 -noout -in cert.pem -hash<br />
# what is its MD5 fingerprint?<br />
openssl x509 -noout -in cert.pem -fingerprint</p></blockquote>
<p><strong>6、如何导出或导入一个 PKCS#12证书</strong><br />
PKCS#12可以有一些如IIS等的应用程序导出或导入。它们通常使用.pfx的扩展文件名。<br />
要创建一个PKCS#12证书，你需要一个私钥和证书。在下面的转换过程中，你有机会为证书输入一个“Export Password”（也可以留空）：<br />
# 创建一个包括密钥和自签名的证书文件</p>
<p style="margin: 1em 1em 0pt; font-weight: bold;">QUOTE:</p>
<blockquote style="line-height: 1.8em; margin: 0pt 1em 1em; border: #dddddd 1px dotted; padding: 0.5em;"><p>openssl req \<br />
  -x509 -nodes -days 365 \<br />
  -newkey rsa:1024 -keyout mycert.pem -out mycert.pem<br />
# 把mycert.pem导出为mycert.pfx的PKCS#12文件<br />
openssl pkcs12 -export \<br />
  -out mycert.pfx -in mycert.pem \<br />
  -name &#8220;My Certificate&#8221;</p></blockquote>
<p>如果有人发给你的是PKCS#12文件（含Export Password），你也可以export它为标准的PEM格式：<br />
# 导出证书和短语密钥</p>
<p style="margin: 1em 1em 0pt; font-weight: bold;">CODE:</p>
<p><code style="margin: 0pt 1em 1em; display: block; font: 12px/1.8em Courier,monospace; border: #cccccc 1px solid; padding: 0.5em;">openssl pkcs12 -in mycert.pfx -out mycert.pem -nodes</code># 手动输入短语来导出证书</p>
<p style="margin: 1em 1em 0pt; font-weight: bold;">CODE:</p>
<p><code style="margin: 0pt 1em 1em; display: block; font: 12px/1.8em Courier,monospace; border: #cccccc 1px solid; padding: 0.5em;">openssl pkcs12 -in mycert.pfx -out mycert.pem</code><strong><span style="color: #4169e1;">五、确认证书</span></strong><br />
<strong>1、如何验证一个证书</strong><br />
使用verify选项即可：</p>
<p style="margin: 1em 1em 0pt; font-weight: bold;">CODE:</p>
<p><code style="margin: 0pt 1em 1em; display: block; font: 12px/1.8em Courier,monospace; border: #cccccc 1px solid; padding: 0.5em;">openssl verify cert.pem</code>当验证通过，会显示OK信息：</p>
<p style="margin: 1em 1em 0pt; font-weight: bold;">QUOTE:</p>
<blockquote style="line-height: 1.8em; margin: 0pt 1em 1em; border: #dddddd 1px dotted; padding: 0.5em;"><p>$ openssl verify remote.site.pem<br />
remote.site.pem: OK</p></blockquote>
<p>如果有错误，可得到简短的问题描述：</p>
<p style="margin: 1em 1em 0pt; font-weight: bold;">QUOTE:</p>
<blockquote style="line-height: 1.8em; margin: 0pt 1em 1em; border: #dddddd 1px dotted; padding: 0.5em;"><p>error 10 at 0 depth lookup:certificate has expired.<br />
证书已经过期。<br />
error 18 at 0 depth lookup:self signed certificate.<br />
除非有例外，否则，OpenSSL不会校验一个自签名的证书。</p></blockquote>
<p><strong>2、有哪些证书发行者是OpenSSL认可的</strong><br />
当在OpenSSL安装到系统中时，会配置一个“Directory for OpenSSL files”目录（编译时，通过&#8211;openssldir参数指定）。该目录存放有系统相信的证书发行者。可以使用下面的命令得到：（以红旗DC Server 5.0为例）</p>
<p style="margin: 1em 1em 0pt; font-weight: bold;">QUOTE:</p>
<blockquote style="line-height: 1.8em; margin: 0pt 1em 1em; border: #dddddd 1px dotted; padding: 0.5em;"><p>$ openssl version -d<br />
OPENSSLDIR: &#8220;/usr/share/ssl&#8221;</p></blockquote>
<p>在certs的目录和子目录中，你发现一到三种类型的文件：<br />
cert.pem 一个大文件，是像VerSign和Thawte的机构通过的证书；<br />
在certs子目录，有些小文件，是CA的；<br />
一些比较模糊的文件，有类似052eae11.0的文件名，并链接向.pem文件的。这些文件的第一部分实际上是基于指向.pem文件的hash值，而文件的扩展名意义不大，因为它理论上可以由不同的证书来创建咯。<br />
例如在我的Gentoo系统，有个f73e89fd.0的文件，其指向vsignss.pem，就有：</p>
<p style="margin: 1em 1em 0pt; font-weight: bold;">QUOTE:</p>
<blockquote style="line-height: 1.8em; margin: 0pt 1em 1em; border: #dddddd 1px dotted; padding: 0.5em;"><p>$ openssl x509 -noout -hash -in vsignss.pem<br />
f73e89fd</p></blockquote>
<p>当一个程序处理一个远程的证书，它将检查cert.pem是否存在，不存在这创建hash值文件，存在，则校验该证书。<br />
<strong>3、如何让OpenSSL任何和校验一个证书</strong><br />
把文件放到certs目录，并创建hash值文件，下面的脚本做到这一点：</p>
<p style="margin: 1em 1em 0pt; font-weight: bold;">QUOTE:</p>
<blockquote style="line-height: 1.8em; margin: 0pt 1em 1em; border: #dddddd 1px dotted; padding: 0.5em;"><p>#!/bin/sh<br />
#<br />
# usage: certlink.sh filename [filename ...]</p>
<p>for CERTFILE in $*; do<br />
  # make sure file exists and is a valid cert<br />
  test -f &#8220;$CERTFILE&#8221; || continue<br />
  HASH=$(openssl x509 -noout -hash -in &#8220;$CERTFILE&#8221;)<br />
  test -n &#8220;$HASH&#8221; || continue</p>
<p>  # use lowest available iterator for symlink<br />
  for ITER in 0 1 2 3 4 5 6 7 8 9; do<br />
    test -f &#8220;${HASH}.${ITER}&#8221; &amp;&amp; continue<br />
    ln -s &#8220;$CERTFILE&#8221; &#8220;${HASH}.${ITER}&#8221;<br />
    test -L &#8220;${HASH}.${ITER}&#8221; &amp;&amp; break<br />
  done<br />
done</p></blockquote>
<p><strong><span style="color: #4169e1;">六、客户端和服务端的命令</span></strong><br />
s_client和s_server选项提供一个方法执行SSL的客户端和服务端。<br />
<strong>1、如何连接一个安全的SMTP服务端</strong><br />
你可以使用s_client选项来连接一个SSL SMTP服务端。安全的SMTP使用3个端口：25（TLS），465（SSL），587（TLS）。0.9.7版本后，openssl可以通过 -starttls来和smtp服务端通讯：</p>
<p style="margin: 1em 1em 0pt; font-weight: bold;">QUOTE:</p>
<blockquote style="line-height: 1.8em; margin: 0pt 1em 1em; border: #dddddd 1px dotted; padding: 0.5em;"><p># port 25/TLS; use same syntax for port 587<br />
openssl s_client -connect remote.host:25 -starttls smtp<br />
# port 465/SSL<br />
openssl s_client -connect remote.host:465</p></blockquote>
<p>大部分的邮件代理不区分&lt;LF&gt;或&lt;CRLF&gt;，但Qmail例外，所以，对于Qmail，可以这样：</p>
<p style="margin: 1em 1em 0pt; font-weight: bold;">CODE:</p>
<p><code style="margin: 0pt 1em 1em; display: block; font: 12px/1.8em Courier,monospace; border: #cccccc 1px solid; padding: 0.5em;">openssl s_client -connect remote.host:25 -crlf -starttls smtp</code><strong>2、如何连接其他安全服务端</strong><br />
连接到不同的，但均使用SSL的服务端是相同的：</p>
<p style="margin: 1em 1em 0pt; font-weight: bold;">QUOTE:</p>
<blockquote style="line-height: 1.8em; margin: 0pt 1em 1em; border: #dddddd 1px dotted; padding: 0.5em;"><p># https: HTTP over SSL<br />
openssl s_client -connect remote.host:443<br />
# ldaps: LDAP over SSL<br />
openssl s_client -connect remote.host:636<br />
# imaps: IMAP over SSL<br />
openssl s_client -connect remote.host:993<br />
# pop3s: POP-3 over SSL<br />
openssl s_client -connect remote.host:995</p></blockquote>
<p><strong>3、如何使用命令行建立一个 SSL server</strong><br />
s_server可以实现这个目的。但更好的办法，是使用Stunnel代替：</p>
<p style="margin: 1em 1em 0pt; font-weight: bold;">QUOTE:</p>
<blockquote style="line-height: 1.8em; margin: 0pt 1em 1em; border: #dddddd 1px dotted; padding: 0.5em;"><p># -www选项将返回一个HTML格式的页面给客户端<br />
openssl s_server -cert mycert.pem -www<br />
# -WWW选项模拟一个简单的web server，而使用当前目录的信息来返回给客户端。<br />
# 在这个例子中，我们指定443端口代替默认的4433端口<br />
openssl s_server -accept 443 -cert mycert.pem -WWW</p></blockquote>
<p><strong><span style="color: #4169e1;">七、dgst选项</span></strong><br />
<strong>1、如果创建一个文件的MD5或SHA1摘要</strong><br />
# MD5 digest<br />
openssl dgst -md5 filename<br />
# SHA1 digest<br />
openssl dgst -sha1 filename<br />
其结果和md5sum、sha1sum的结果是相同的。<br />
<strong>2、签名</strong><br />
如果你希望使用digest，实现没有你的私钥而不能修改文件的目的。下面的例子使用SHA1实现：</p>
<p style="margin: 1em 1em 0pt; font-weight: bold;">QUOTE:</p>
<blockquote style="line-height: 1.8em; margin: 0pt 1em 1em; border: #dddddd 1px dotted; padding: 0.5em;"><p># signed digest will be foo-1.23.tar.gz.sha1<br />
openssl dgst -sha1 \<br />
  -sign mykey.pem<br />
  -out foo-1.23.tar.gz.sha1 \<br />
  foo-1.23.tar.gz</p></blockquote>
<p>而foo-1.23.tar.gz.sha1 就是foo-1.23.tar.gz的签名信息公钥。<br />
<strong>3、校验签名</strong><br />
要校验签名，需要有签名人的公钥：</p>
<p style="margin: 1em 1em 0pt; font-weight: bold;">QUOTE:</p>
<blockquote style="line-height: 1.8em; margin: 0pt 1em 1em; border: #dddddd 1px dotted; padding: 0.5em;"><p># to verify foo-1.23.tar.gz using foo-1.23.tar.gz.sha1<br />
# and pubkey.pem<br />
openssl dgst -sha1 \<br />
  -verify pubkey.pem \<br />
  -signature foo-1.23.tar.gz.sha1 \<br />
  foo-1.23.tar.gz</p></blockquote>
<p><strong>4、创建Apache digest password entry</strong><br />
Apache使用特殊的密码格式，而使用htdigest组件，仅输出到文件，而非标准输出。当对于远端用户，它比较方便用户在他们信任的机器上创建密码。下面的脚本模拟htdigest的输出，并显示到标准输出：</p>
<p style="margin: 1em 1em 0pt; font-weight: bold;">QUOTE:</p>
<blockquote style="line-height: 1.8em; margin: 0pt 1em 1em; border: #dddddd 1px dotted; padding: 0.5em;"><p>#!/bin/bash</p>
<p>echo &#8220;Create an Apache-friendly Digest Password Entry&#8221;<br />
echo &#8220;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;&#8221;</p>
<p># get user input, disabling tty echoing for password<br />
read -p &#8220;Enter username: &#8221; UNAME<br />
read -p &#8220;Enter Apache AuthName: &#8221; AUTHNAME<br />
read -s -p &#8220;Enter password: &#8221; PWORD; echo</p>
<p>printf &#8220;\n%s:%s:%s\n&#8221; \<br />
  &#8221;$UNAME&#8221; \<br />
  &#8221;$AUTHNAME&#8221; \<br />
  $(printf &#8220;${UNAME}:${AUTHNAME}:${PWORD}&#8221; | openssl dgst -md5)</p></blockquote>
<p><strong>5、其他可以使用的digest类型</strong><br />
通过下面的命令可以得到所有的列表：</p>
<p style="margin: 1em 1em 0pt; font-weight: bold;">CODE:</p>
<p><code style="margin: 0pt 1em 1em; display: block; font: 12px/1.8em Courier,monospace; border: #cccccc 1px solid; padding: 0.5em;">openssl list-message-digest-commands</code>[newpage]<br />
<strong><span style="color: #4169e1;">七、加密和解密</span></strong><br />
<strong>1、使用base64编码</strong></p>
<p style="margin: 1em 1em 0pt; font-weight: bold;">QUOTE:</p>
<blockquote style="line-height: 1.8em; margin: 0pt 1em 1em; border: #dddddd 1px dotted; padding: 0.5em;"><p># send encoded contents of file.txt to stdout<br />
openssl enc -base64 -in file.txt<br />
# same, but write contents to file.txt.enc<br />
openssl enc -base64 -in file.txt -out file.txt.enc</p></blockquote>
<p>命令行方式：</p>
<p style="margin: 1em 1em 0pt; font-weight: bold;">CODE:</p>
<p><code style="margin: 0pt 1em 1em; display: block; font: 12px/1.8em Courier,monospace; border: #cccccc 1px solid; padding: 0.5em;">$ echo "encode me" | openssl enc -base64<br />
ZW5jb2RlIG1lCg==</code><span style="color: #ff4500;">※注意，echo默认会输出回车符，可使用-n参数屏蔽：</span></p>
<p style="margin: 1em 1em 0pt; font-weight: bold;">CODE:</p>
<p><code style="margin: 0pt 1em 1em; display: block; font: 12px/1.8em Courier,monospace; border: #cccccc 1px solid; padding: 0.5em;">$ echo -n "encode me" | openssl enc -base64<br />
ZW5jb2RlIG1l</code>解密使用-d参数：</p>
<p style="margin: 1em 1em 0pt; font-weight: bold;">CODE:</p>
<p><code style="margin: 0pt 1em 1em; display: block; font: 12px/1.8em Courier,monospace; border: #cccccc 1px solid; padding: 0.5em;">$ echo "ZW5jb2RlIG1lCg==" | openssl enc -base64 -d<br />
encode me</code><strong>2、如何简单地加密一个文件</strong><br />
使用cipher是一种比较简单的加密方式，下面的命令可以知道其支持的运算规则：</p>
<p style="margin: 1em 1em 0pt; font-weight: bold;">CODE:</p>
<p><code style="margin: 0pt 1em 1em; display: block; font: 12px/1.8em Courier,monospace; border: #cccccc 1px solid; padding: 0.5em;">openssl list-cipher-commands</code>当你选择号一个运算规则后，需要决定是否使用base64编码，以使用可打印字符来代替二进制方式的显示（例如要发送邮件），就可以这样做：</p>
<p style="margin: 1em 1em 0pt; font-weight: bold;">QUOTE:</p>
<blockquote style="line-height: 1.8em; margin: 0pt 1em 1em; border: #dddddd 1px dotted; padding: 0.5em;"><p># encrypt file.txt to file.enc using 256-bit AES in CBC mode<br />
openssl enc -aes-256-cbc -salt -in file.txt -out file.enc<br />
# the same, only the output is base64 encoded for, e.g., e-mail<br />
openssl enc -aes-256-cbc <span style="color: #ff4500;">-a</span> -salt -in file.txt -out file.enc</p></blockquote>
<p>解密时，提供短语和对应的规则即可：</p>
<p style="margin: 1em 1em 0pt; font-weight: bold;">QUOTE:</p>
<blockquote style="line-height: 1.8em; margin: 0pt 1em 1em; border: #dddddd 1px dotted; padding: 0.5em;"><p># decrypt binary file.enc<br />
openssl enc -d -aes-256-cbc -in file.enc<br />
# decrypt base64-encoded version<br />
openssl enc -d -aes-256-cbc -a -in file.enc</p></blockquote>
<p>如果你连短语也不想手动输入，可以使用“PASS PHRASE ARGUMENTS”格式：</p>
<p style="margin: 1em 1em 0pt; font-weight: bold;">QUOTE:</p>
<blockquote style="line-height: 1.8em; margin: 0pt 1em 1em; border: #dddddd 1px dotted; padding: 0.5em;"><p># provide password on command line<br />
openssl enc -aes-256-cbc -salt -in file.txt \<br />
  -out file.enc -pass pass:mySillyPassword<br />
# provide password in a file<br />
openssl enc -aes-256-cbc -salt -in file.txt \<br />
  -out file.enc -pass file:/path/to/secret/password.txt</p></blockquote>
<p><strong><span style="color: #4169e1;">八、错误</span></strong><br />
如果你从日志中发现一些SSL的内容错误信息，例如：<br />
sshd[31784]: error: RSA_public_decrypt failed: error:0407006A:lib(4):func(112):reason(106)<br />
sshd[770]: error: RSA_public_decrypt failed: error:0407006A:lib(4):func(112):reason(106)<br />
你应该把error和lib之间的代码提取出来，并查询：<br />
$ openssl errstr 0407006A<br />
error:0407006A:rsa routines:RSA_padding_check_PKCS1_type_1:block type is not 01<br />
这样，再从manual里面去搜索信息，能比较好的解决问题。</p>
<p><strong><span style="color: #4169e1;">九、密钥</span></strong><br />
<strong>1、如果创建一个RSA密钥</strong><br />
使用genrsa选项：</p>
<p style="margin: 1em 1em 0pt; font-weight: bold;">QUOTE:</p>
<blockquote style="line-height: 1.8em; margin: 0pt 1em 1em; border: #dddddd 1px dotted; padding: 0.5em;"><p># default 512-bit key, sent to standard output<br />
openssl genrsa<br />
# 1024-bit key, saved to file named mykey.pem<br />
openssl genrsa -out mykey.pem 1024<br />
# same as above, but encrypted with a passphrase<br />
openssl genrsa -des3 -out mykey.pem 1024</p></blockquote>
<p><strong>2、如何创建一个RSA公钥</strong><br />
使用rsa选项，可以从私钥创建公钥：<br />
openssl rsa -in mykey.pem -pubout<br />
<strong>3、如果创建一个DSA密钥</strong><br />
创建DSA密钥需要parameter file，而且验证比RSA要慢，所以使用范围没有RSA广泛。<br />
如果你想创建一个单一的RSA密钥，可以：</p>
<p style="margin: 1em 1em 0pt; font-weight: bold;">QUOTE:</p>
<blockquote style="line-height: 1.8em; margin: 0pt 1em 1em; border: #dddddd 1px dotted; padding: 0.5em;"><p># key will be called dsakey.pem<br />
openssl dsaparam -noout -out dsakey.pem -genkey 1024</p></blockquote>
<p>另一方面，如果你希望多个DSA密钥共享一个parameter file，可以这样：</p>
<p style="margin: 1em 1em 0pt; font-weight: bold;">QUOTE:</p>
<blockquote style="line-height: 1.8em; margin: 0pt 1em 1em; border: #dddddd 1px dotted; padding: 0.5em;"><p># create parameters in dsaparam.pem<br />
openssl dsaparam -out dsaparam.pem 1024<br />
# create first key<br />
openssl gendsa -out key1.pem dsaparam.pem<br />
# and second &#8230;<br />
openssl gendsa -out key2.pem dsaparam.pem</p></blockquote>
<p><strong>4、创建elliptic curve key</strong><br />
OpenSSL 0.9.8以上的版本才支持elliptic curve key：</p>
<p style="margin: 1em 1em 0pt; font-weight: bold;">CODE:</p>
<p><code style="margin: 0pt 1em 1em; display: block; font: 12px/1.8em Courier,monospace; border: #cccccc 1px solid; padding: 0.5em;">openssl ecparam -out key.pem -name prime256v1 -genkey</code># -name 选型可以使用的参数，可通过下面的命令获得：</p>
<p style="margin: 1em 1em 0pt; font-weight: bold;">CODE:</p>
<p><code style="margin: 0pt 1em 1em; display: block; font: 12px/1.8em Courier,monospace; border: #cccccc 1px solid; padding: 0.5em;">openssl ecparam -list_curves</code><strong>5、如何从一个密钥移除passphrase（短语）</strong><br />
依赖于你使用rsa或dsa方式，使用不同的处理方法。<br />
假设你创建的RSA密钥，并放在单独的key.pem文件，那么下面的命令后，你就可以得到一个没有短语加密，但相同编码的RSA密钥 newkey.pem</p>
<p style="margin: 1em 1em 0pt; font-weight: bold;">QUOTE:</p>
<blockquote style="line-height: 1.8em; margin: 0pt 1em 1em; border: #dddddd 1px dotted; padding: 0.5em;"><p># you&#8217;ll be prompted for your passphrase one last time<br />
openssl rsa -in key.pem -out newkey.pem</p></blockquote>
<p>通常，私钥和公钥可以放在同一个文件。假设叫mycert.pem。通过下面的步骤，也可以得到没有短语的文件newcert.pem</p>
<p style="margin: 1em 1em 0pt; font-weight: bold;">QUOTE:</p>
<blockquote style="line-height: 1.8em; margin: 0pt 1em 1em; border: #dddddd 1px dotted; padding: 0.5em;"><p># you&#8217;ll need to type your passphrase once more<br />
openssl rsa -in mycert.pem -out newcert.pem<br />
openssl x509 -in mycert.pem &gt;&gt;newcert.pem</p></blockquote>
<p>[newpage]<br />
<strong><span style="color: #4169e1;">十、Password hashes</span></strong><br />
使用passwd选项，你可以得到一个类似/etc/passwd或者/etc/shadow格式的密码。<br />
1、创建一个crypt-style密码</p>
<p style="margin: 1em 1em 0pt; font-weight: bold;">QUOTE:</p>
<blockquote style="line-height: 1.8em; margin: 0pt 1em 1em; border: #dddddd 1px dotted; padding: 0.5em;"><p>$ openssl passwd MySecret<br />
8E4vqBR4UOYF</p></blockquote>
<p>如果知道已经存在密码的“salt”，可以复制其hash：</p>
<p style="margin: 1em 1em 0pt; font-weight: bold;">QUOTE:</p>
<blockquote style="line-height: 1.8em; margin: 0pt 1em 1em; border: #dddddd 1px dotted; padding: 0.5em;"><p>$ openssl passwd -salt 8E MySecret<br />
8E4vqBR4UOYF.</p></blockquote>
<p>否则，即使相同的密码，因每次的hash不同，结果也不同的。<br />
2、创建一个shadow-style的密码<br />
新的Unix系统（包括linux），都使用安全的MD5-based来作为salt，可以这样产生类似的密码：</p>
<p style="margin: 1em 1em 0pt; font-weight: bold;">QUOTE:</p>
<blockquote style="line-height: 1.8em; margin: 0pt 1em 1em; border: #dddddd 1px dotted; padding: 0.5em;"><p>$ openssl passwd -1 MySecret<br />
$1$HkrAilcM$Jy3vYQc8UiEXfTLRrlSpD.</p></blockquote>
<p>而slat在二到三$符号之间，所以有：</p>
<p style="margin: 1em 1em 0pt; font-weight: bold;">QUOTE:</p>
<blockquote style="line-height: 1.8em; margin: 0pt 1em 1em; border: #dddddd 1px dotted; padding: 0.5em;"><p>$ openssl passwd -1 -salt HkrAilcM MySecret<br />
$1$HkrAilcM$Jy3vYQc8UiEXfTLRrlSpD.</p></blockquote>
<p><strong><span style="color: #4169e1;">十一、Prime numbers（素数）</span></strong><br />
从0.9.7e之后，prime选项被加入到openssl库中。<br />
1、如何判断一个数字是否prime<br />
使用prime选项即可。需要注意的是，返回的结果是十六进制，而非十进制形式的。</p>
<p style="margin: 1em 1em 0pt; font-weight: bold;">QUOTE:</p>
<blockquote style="line-height: 1.8em; margin: 0pt 1em 1em; border: #dddddd 1px dotted; padding: 0.5em;"><p>$ openssl prime 119054759245460753<br />
1A6F7AC39A53511 is not prime<br />
$ openssl prime -hex 2f<br />
2F is prime</p></blockquote>
<p>2、如何创建一组prime numbers</p>
<p style="margin: 1em 1em 0pt; font-weight: bold;">QUOTE:</p>
<blockquote style="line-height: 1.8em; margin: 0pt 1em 1em; border: #dddddd 1px dotted; padding: 0.5em;"><p># define start and ending points<br />
AQUO=10000<br />
ADQUEM=10100<br />
for N in $(seq $AQUO $ADQUEM); do<br />
  # use bc to convert hex to decimal<br />
  openssl prime $N | awk &#8216;/is prime/ {print &#8220;ibase=16;&#8221;$1}&#8217; | bc<br />
done</p></blockquote>
<p><strong><span style="color: #4169e1;">十二、随机数</span></strong><br />
使用rand选项可以得到二进制或base64编码后的随机数：</p>
<p style="margin: 1em 1em 0pt; font-weight: bold;">QUOTE:</p>
<blockquote style="line-height: 1.8em; margin: 0pt 1em 1em; border: #dddddd 1px dotted; padding: 0.5em;"><p># write 128 random bytes of base64-encoded data to stdout<br />
openssl rand -base64 128<br />
# write 1024 bytes of binary random data to a file<br />
openssl rand -out random-data.bin 1024<br />
# seed openssl with semi-random bytes from browser cache<br />
cd $(find ~/.mozilla/firefox -type d -name Cache)<br />
openssl rand -rand $(find . -type f -printf &#8216;%f:&#8217;) -base64 1024</p></blockquote>
<p>从 /dev/urandom可以得到类似的种子：</p>
<p style="margin: 1em 1em 0pt; font-weight: bold;">QUOTE:</p>
<blockquote style="line-height: 1.8em; margin: 0pt 1em 1em; border: #dddddd 1px dotted; padding: 0.5em;"><p># get 32 bytes from /dev/urandom and base64 encode them<br />
head -c 32 /dev/urandom | openssl enc -base64</p></blockquote>
<p><strong><span style="color: #4169e1;">十三、S/MIME</span></strong><br />
S/MIME是发送和接收安全MIME的一个标准，常用于email中。通过OpenSSL的smime选项，可以提供命令行的S/MIME服务。<br />
<strong>1、如何校验一个已经签名的S/MIME信息</strong><br />
把收到的信息保存到msg.txt文件即可：</p>
<p style="margin: 1em 1em 0pt; font-weight: bold;">CODE:</p>
<p><code style="margin: 0pt 1em 1em; display: block; font: 12px/1.8em Courier,monospace; border: #cccccc 1px solid; padding: 0.5em;">openssl smime -verify -in msg.txt</code>如果发送人的证书被OpenSSL接受的，可以得到：</p>
<p style="margin: 1em 1em 0pt; font-weight: bold;">QUOTE:</p>
<blockquote style="line-height: 1.8em; margin: 0pt 1em 1em; border: #dddddd 1px dotted; padding: 0.5em;"><p>Verification successful.</p></blockquote>
<p>而如果内容被非认证架构修改，会得到错误信息：</p>
<p style="margin: 1em 1em 0pt; font-weight: bold;">QUOTE:</p>
<blockquote style="line-height: 1.8em; margin: 0pt 1em 1em; border: #dddddd 1px dotted; padding: 0.5em;"><p>Verification failure<br />
23016:error:21071065:PKCS7 routines:PKCS7_signatureVerify:digest<br />
failure:pk7_doit.c:804:<br />
23016:error:21075069:PKCS7 routines:PKCS7_verify:signature<br />
failure:pk7_smime.c:265:</p></blockquote>
<p>而如果发送人的证书不在OpenSSL的识别范围内，也会出错：</p>
<p style="margin: 1em 1em 0pt; font-weight: bold;">QUOTE:</p>
<blockquote style="line-height: 1.8em; margin: 0pt 1em 1em; border: #dddddd 1px dotted; padding: 0.5em;"><p>Verification failure<br />
9544:error:21075075:PKCS7 routines:PKCS7_verify:certificate verify<br />
error:pk7_smime.c:222:Verify error:self signed certificate</p></blockquote>
<p>大部分的邮件客户端，会随信息发送一个公共证书，从命令行也可以看到证书的信息：</p>
<p style="margin: 1em 1em 0pt; font-weight: bold;">CODE:</p>
<p><code style="margin: 0pt 1em 1em; display: block; font: 12px/1.8em Courier,monospace; border: #cccccc 1px solid; padding: 0.5em;">openssl smime -pk7out -in msg.txt | \<br />
openssl pkcs7 -text -noout -print_certs</code>通过下面的命令，得到证书的copy</p>
<p style="margin: 1em 1em 0pt; font-weight: bold;">CODE:</p>
<p><code style="margin: 0pt 1em 1em; display: block; font: 12px/1.8em Courier,monospace; border: #cccccc 1px solid; padding: 0.5em;">openssl smime -pk7out -in msg.txt -out her-cert.pem</code>这样，你就可以再次利用它来验证</p>
<p style="margin: 1em 1em 0pt; font-weight: bold;">CODE:</p>
<p><code style="margin: 0pt 1em 1em; display: block; font: 12px/1.8em Courier,monospace; border: #cccccc 1px solid; padding: 0.5em;">openssl smime -verify -in msg.txt -CAfile /path/to/her-cert.pem</code><strong>2、如何加密一个S/MIME信息</strong><br />
假设某人把她的公共证书发给你，并且要求你加密这些信息才给它。你应保存她的her-cert.pem文件。然后再reply。<br />
为获得the default—though fairly weak—RC2-40 encryption，你应该告诉openssl信息和证书的位置</p>
<p style="margin: 1em 1em 0pt; font-weight: bold;">CODE:</p>
<p><code style="margin: 0pt 1em 1em; display: block; font: 12px/1.8em Courier,monospace; border: #cccccc 1px solid; padding: 0.5em;">openssl smime her-cert.pem -encrypt -in my-message.txt</code>如果你确认对方有robust SSL toolkit，你可以指定一个类似DES的运算法则来加密</p>
<p style="margin: 1em 1em 0pt; font-weight: bold;">CODE:</p>
<p><code style="margin: 0pt 1em 1em; display: block; font: 12px/1.8em Courier,monospace; border: #cccccc 1px solid; padding: 0.5em;">openssl smime her-cert.pem -encrypt -des3 -in my-message.txt</code>当使用sendmail时，可以一并来实现</p>
<p style="margin: 1em 1em 0pt; font-weight: bold;">CODE:</p>
<p><code style="margin: 0pt 1em 1em; display: block; font: 12px/1.8em Courier,monospace; border: #cccccc 1px solid; padding: 0.5em;">openssl smime her-cert.pem \<br />
  -encrypt \<br />
  -des3 \<br />
  -in my-message.txt \<br />
  -from 'Your Fullname &lt;you@youraddress.com&gt;' \<br />
  -to 'Her Fullname &lt;her@heraddress.com&gt;' \<br />
  -subject 'My encrypted reply' |\<br />
sendmail her@heraddress.com</code><strong>3、如何对S/MIME信息签名</strong><br />
如果你不想加密，而只是想签名，可以这样：</p>
<p style="margin: 1em 1em 0pt; font-weight: bold;">CODE:</p>
<p><code style="margin: 0pt 1em 1em; display: block; font: 12px/1.8em Courier,monospace; border: #cccccc 1px solid; padding: 0.5em;">openssl smime \<br />
  -sign \<br />
  -signer /path/to/your-cert.pem \<br />
  -in my-message.txt \<br />
  -from 'Your Fullname &lt;you@youraddress.com&gt;' \<br />
  -to 'Her Fullname &lt;her@heraddress.com&gt;' \<br />
  -subject 'My signed reply' |\<br />
sendmail her@heraddress.com</code>唯一的区别，就是使用你自己的密钥和证书，而非发送者的证书咯。</div>
</div>
</div>
</div>
</div>
</div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.fallday.org/archives/532/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>linux下tar做文件系统增量备份</title>
		<link>http://www.fallday.org/archives/524</link>
		<comments>http://www.fallday.org/archives/524#comments</comments>
		<pubDate>Sun, 25 Apr 2010 03:57:30 +0000</pubDate>
		<dc:creator>fallday</dc:creator>
				<category><![CDATA[主机管理]]></category>
		<category><![CDATA[操作系统]]></category>
		<category><![CDATA[cvs]]></category>
		<category><![CDATA[tar]]></category>
		<category><![CDATA[备份]]></category>

		<guid isPermaLink="false">http://www.fallday.org/?p=524</guid>
		<description><![CDATA[想给项目的CVS做个自动备份的脚本，一看目录大小，已经有近20个G。天天做完整备份太费资源了，增量备份是一个解决方案了。计划每周末做一次完整备份，然后每天做增量备份。
Linux做增量备份还是很容易的，tar命令就可以。
在cron里设置,每周日晚执行(每周日全备份,其余时间增量备份)。下面是从网上找了两个示例的脚本。
示例一: (http://www.cnblogs.com/coffee_cn/archive/2010/03/26/1697038.html)

#!/bin/bash

# define
dayofweek=`date "+%u"`
today=`date "+%Y%m%d"`
source=/data/
backup=/backup/

# action
cd $backup

if [ $dayofweek -eq 1 ]; then
　　if [ ! -f "full$today.tar.gz" ]; then
　　　　rm -rf snapshot
　　　　tar -g snapshot -zcf "full$today.tar.gz" $source
　　fi
else
　　if [ ! -f "inc$today.tar.gz" ]; then
　　　　tar -g snapshot -zcf "inc$today.tar.gz" $source
　　fi
fi

示例二: (http://www.futuremedia.pl/pub/projekty/backup/backup)

#!/bin/bash
# simple backup script. intended to run daily from crontab
# called "biedacula" after "bieda", which is Polish word [...]]]></description>
			<content:encoded><![CDATA[<p>想给项目的CVS做个自动备份的脚本，一看目录大小，已经有近20个G。天天做完整备份太费资源了，增量备份是一个解决方案了。计划每周末做一次完整备份，然后每天做增量备份。</p>
<p>Linux做增量备份还是很容易的，tar命令就可以。</p>
<p><span id="more-524"></span>在cron里设置,每周日晚执行(每周日全备份,其余时间增量备份)。下面是从网上找了两个示例的脚本。</p>
<p>示例一: (http://www.cnblogs.com/coffee_cn/archive/2010/03/26/1697038.html)</p>
<pre>
#!/bin/bash

# define
dayofweek=`date "+%u"`
today=`date "+%Y%m%d"`
source=/data/
backup=/backup/

# action
cd $backup

if [ $dayofweek -eq 1 ]; then
　　if [ ! -f "full$today.tar.gz" ]; then
　　　　rm -rf snapshot
　　　　tar -g snapshot -zcf "full$today.tar.gz" $source
　　fi
else
　　if [ ! -f "inc$today.tar.gz" ]; then
　　　　tar -g snapshot -zcf "inc$today.tar.gz" $source
　　fi
fi
</pre>
<p>示例二: (http://www.futuremedia.pl/pub/projekty/backup/backup)</p>
<pre>
#!/bin/bash
# simple backup script. intended to run daily from crontab
# called "biedacula" after "bieda", which is Polish word for "poor".

# implements poor man's GFS scheme, hence the name:)
# requires GNU tar, GNU gzip and ncftp

# these files must contain file/dir paths (one a line)
PATHFILE=/etc/backup-defs
SKIPFILE=/etc/backup-excludes
# this is a snapshot file auto-created by GNU tar
SNAPSHOT=/etc/backup-snapshot

# FTP host to send backups ( must allow anonymous RW access for me )
FTPHOST=192.168.2.2
FTPPORT=21

# when to do full, monthly/weekly  backups
FULL_MONTHDAY=1  # 1st day of month
FULL_WEEKDAY=7  # Sunday

# how many "tapes" for monthly backups
KEEP_MONTHLY=3
# how many "tapes" for weekly backups
KEEP_WEEKLY=4
# in total you will have ( KEEP_MONTHLY + KEEP_WEEKLY + 6 ) "tapes"

function biedump {
  local TYPE=$1
  local LABEL=$2
  local start=`date +%Y%m%d%H%M`
  echo "$start: Starting $TYPE dump to label $LABEL"
  if [ "x$TYPE" == "xfull" ] ; then
    rm -rf $SNAPSHOT
  fi
  tar -c -T$PATHFILE -X$SKIPFILE -g$SNAPSHOT -P -f - \
   | gzip \
   | ncftpput -c -S.tmp -P $FTPPORT $FTPHOST $LABEL
  local res=$?
  local end=`date +%Y%m%d%H%M`
  if [ $res -eq 0 ]; then
	echo "$end: $TYPE dump OK."
  else
    echo "$end: $TYPE dump FAILED with exit code $res."
  fi
}

host=`hostname -f`
yyyy=`date +%Y`
mm=`date +%m`
dd=`date +%d`
ww=`date +%V`
day_of_week=`date +%u`
dayofweek=`date +%a`

echo "Hello. This is biedacula backup running at $host."
echo "Today is $yyyy/$mm/$dd, day $day_of_week ($dayofweek) of week $ww."

if [ $dd -eq $FULL_MONTHDAY ]; then
  let " n = ( mm % $KEEP_MONTHLY ) + 1 "
  biedump 'full' "$host-M-$n.tgz"
elif [ $day_of_week -eq $FULL_WEEKDAY ] ; then
  let " n = ( ww % $KEEP_WEEKLY ) + 1 "
  biedump 'full' "$host-W-$n.tgz"
else
  biedump 'incr' "$host-D-$dayofweek.tgz"
fi
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.fallday.org/archives/524/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WAS 7在多网络接口下创建profile失败</title>
		<link>http://www.fallday.org/archives/522</link>
		<comments>http://www.fallday.org/archives/522#comments</comments>
		<pubDate>Sun, 18 Apr 2010 04:53:32 +0000</pubDate>
		<dc:creator>fallday</dc:creator>
				<category><![CDATA[Web服务]]></category>
		<category><![CDATA[主机管理]]></category>
		<category><![CDATA[WAS 7]]></category>
		<category><![CDATA[WebSphere]]></category>

		<guid isPermaLink="false">http://www.fallday.org/?p=522</guid>
		<description><![CDATA[今天在一个系统下(SLES 10)安装WebSphere Application Server(WAS)版本7时，总是在创建Application Server Profile时失败。感觉安装过程上并没有什么问题，以前也安装过许多次了。
想想还是要从这个系统和以前有什么不同找解决方案。想到一个不同就是这个系统除了正常的网络接口(eth0, localhost)，还设置有一个dummy网络接口。虽然觉得这并不该影响到WAS的安装，便想不到别的办法也只能尝试一下。
暂时down掉一个接口eth0 ( ifconfig eth0 down ), 然后再运行WAS的profile创建，成功了！创建成功后再再up eth0，启动使用WAS也没有问题。
我想这是WAS 7的一个小bug. 
]]></description>
			<content:encoded><![CDATA[<p>今天在一个系统下(SLES 10)安装WebSphere Application Server(WAS)版本7时，总是在创建Application Server Profile时失败。感觉安装过程上并没有什么问题，以前也安装过许多次了。</p>
<p>想想还是要从这个系统和以前有什么不同找解决方案。想到一个不同就是这个系统除了正常的网络接口(eth0, localhost)，还设置有一个dummy网络接口。虽然觉得这并不该影响到WAS的安装，便想不到别的办法也只能尝试一下。</p>
<p><span id="more-522"></span>暂时down掉一个接口eth0 ( ifconfig eth0 down ), 然后再运行WAS的profile创建，成功了！创建成功后再再up eth0，启动使用WAS也没有问题。</p>
<p>我想这是WAS 7的一个小bug. </p>
]]></content:encoded>
			<wfw:commentRss>http://www.fallday.org/archives/522/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>自动启动DB2 administration server</title>
		<link>http://www.fallday.org/archives/519</link>
		<comments>http://www.fallday.org/archives/519#comments</comments>
		<pubDate>Sun, 18 Apr 2010 04:40:35 +0000</pubDate>
		<dc:creator>fallday</dc:creator>
				<category><![CDATA[主机管理]]></category>
		<category><![CDATA[内容管理]]></category>
		<category><![CDATA[dasauto]]></category>
		<category><![CDATA[DB2]]></category>

		<guid isPermaLink="false">http://www.fallday.org/?p=519</guid>
		<description><![CDATA[可以通过DB2的dasauto命令来设置是否开机自动启动DB2 administration server. 这个命令只在Linux或者UNIX系统下有效。
Enables or disables autostarting of the DB2® administration server. 
This command is available on Linux® and UNIX® systems only. It is located in the DB2DIR/das/adm directory, where DB2DIR is the location where the current version of the DB2 database product is installed.
Authorization
dasadm
Required connection
None
Command syntax
>>-dasauto&#8211;+&#8212;&#8211;+&#8211;+- -on&#8211;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;>]]></description>
			<content:encoded><![CDATA[<p>可以通过DB2的dasauto命令来设置是否开机自动启动DB2 administration server. 这个命令只在Linux或者UNIX系统下有效。</p>
<p>Enables or disables autostarting of the DB2® administration server. </p>
<p><span id="more-519"></span>This command is available on Linux® and UNIX® systems only. It is located in the DB2DIR/das/adm directory, where DB2DIR is the location where the current version of the DB2 database product is installed.</p>
<p>Authorization<br />
dasadm</p>
<p>Required connection<br />
None</p>
<p>Command syntax</p>
<p>>>-dasauto&#8211;+&#8212;&#8211;+&#8211;+- -on&#8211;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;><<br />
            +- -h-+  &#8216;- -off-&#8217;<br />
            &#8216;- -?-&#8217;              </p>
<p>Command parameters<br />
-h | -?<br />
Displays help information. When this option is specified, all other options are ignored, and only the help information is displayed.<br />
-on<br />
Enables autostarting of the DB2 administration server. The next time the system is restarted, the DB2 administration server will be started automatically.<br />
-off<br />
Disables autostarting of the DB2 administration server. The next time the system is restarted, the DB2 administration server will not be started automatically. </p>
]]></content:encoded>
			<wfw:commentRss>http://www.fallday.org/archives/519/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>DB2 9.5安装没有在/etc/inittab中创建Fault Monitor</title>
		<link>http://www.fallday.org/archives/515</link>
		<comments>http://www.fallday.org/archives/515#comments</comments>
		<pubDate>Sat, 17 Apr 2010 13:10:05 +0000</pubDate>
		<dc:creator>fallday</dc:creator>
				<category><![CDATA[主机管理]]></category>
		<category><![CDATA[内容管理]]></category>
		<category><![CDATA[DB2]]></category>
		<category><![CDATA[db2fmcd]]></category>

		<guid isPermaLink="false">http://www.fallday.org/?p=515</guid>
		<description><![CDATA[今天在Linux下安装Db2 9.5，安装完成后发现并没有象9.1版那样在/etc/inittab文件中有下面一行：
fmc:2345:respawn:/opt/ibm/db2/V9.5/bin/db2fmcd #DB2 Fault
这样原结果是Db2不能开机自动启动。
其实这是DB2 9.5的一个bug，在Fixpack 2以后的版本中就修正了。
自己可以手工修正。
1.Uninstall and reinstall DB2:
  db2_deinstall -a then install DB2  again
or
2.create the inittab entry manually:
  db2fmcu -u -p DB2DIR/bin/db2fmcd
  where DB2DIR is the directory where DB2 is installed.
  For example, if you installed DB2 V9.5 under /opt/ibm/db2/V9.5
  db2fmcu -u -p /opt/ibm/db2/V9.5/bin/db2fmcd
]]></description>
			<content:encoded><![CDATA[<p>今天在Linux下安装Db2 9.5，安装完成后发现并没有象9.1版那样在/etc/inittab文件中有下面一行：</p>
<p>fmc:2345:respawn:/opt/ibm/db2/V9.5/bin/db2fmcd #DB2 Fault</p>
<p>这样原结果是Db2不能开机自动启动。</p>
<p><span id="more-515"></span>其实这是DB2 9.5的一个bug，在Fixpack 2以后的版本中就修正了。</p>
<p>自己可以手工修正。</p>
<p>1.Uninstall and reinstall DB2:<br />
  db2_deinstall -a then install DB2  again</p>
<p>or</p>
<p>2.create the inittab entry manually:<br />
  db2fmcu -u -p DB2DIR/bin/db2fmcd<br />
  where DB2DIR is the directory where DB2 is installed.</p>
<p>  For example, if you installed DB2 V9.5 under /opt/ibm/db2/V9.5<br />
  db2fmcu -u -p /opt/ibm/db2/V9.5/bin/db2fmcd</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fallday.org/archives/515/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
