[转]OpenSSL Command-Line HOWTO
OpenSSL是使用非常广泛的 SSL 的开源实现。由于其中实现了为SSL 所用的各种加密算法,因此OpenSSL也是被广泛使用的加密函数库。SSL/TLS 协议位于 TCP 协议和应用层协议之间,为传输双方提供认证、加密和完整性保护等安全服务。SSL作为一个协议框架,通信双方可以选用合适的对称算法、公钥算法、MAC 算法等密码算法实现安全服务。在Linux环境中,除可以使用OpenSSL提供的各种加密函数库外,还能利用其应用程序实现许多重要的功能。以下内容翻译自:[url=http://www.madboa.com/geek/openssl/#digest-file]OpenSSL Command-Line HOWTO[/url][separator][b][color=#4169E1]一、系统环境[/color][/b]
以红旗DC Server 5.0 for x86 SP2环境为例,自带版本为:
[quote]# rpm -qa|grep openssl
openssl-0.9.7a-43.14
openssl-perl-0.9.7a-43.14
openssl-devel-0.9.7a-43.14
openssl096b-0.9.6b-22.46[/quote]
[b][color=#4169E1]二、介绍[/color][/b]
[b]1、如何知道我的OpenSSL运行版本[/b]
[quote]# openssl version
OpenSSL 0.9.7a Feb 19 2003[/quote]
-a参数可以获得更详细的信息:
[quote]# openssl version -a
OpenSSL 0.9.7a Feb 19 2003
built on: Tue Oct 31 02:10:29 EST 2006
platform: linux-elf
options: bn(64,32) md2(int) rc4(idx,int) des(ptr,risc1,16,long) blowfish(idx)
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,--noexecstack
OPENSSLDIR: "/usr/share/ssl"
engines: dynamic cswift chil atalla nuron ubsec aep ibmca sureware 4758cca[/quote]
[b]2、获取可用的命令列表[/b]
OpenSSL提供三个内置的选项命令组,而通过提供一个错误的参数,可以获得其帮助信息。(例如help、或-h)
[quote]# openssl -h
openssl:Error: '-h' is an invalid command.
Standard commands
asn1parse ca ciphers crl crl2pkcs7
dgst dh dhparam dsa dsaparam
enc engine errstr gendh gendsa
genrsa nseq ocsp passwd pkcs12
pkcs7 pkcs8 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[/quote]
也可以获取某个命令组可用的参数:
[quote]# openssl dgst -h
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
-mdc2 to use the mdc2 message digest algorithm
-ripemd160 to use the ripemd160 message digest algorithm[/quote]
[b]3、如何获取可用的密码(ciphers)列表[/b]
[quote]# 显示所有可用的密码(ciphers)列表
openssl ciphers -v
# 仅显示TLSv1版本的密码
openssl ciphers -v -tls1
# 仅显示密钥大于128bit的高强度密码方式
openssl ciphers -v 'HIGH'
# 仅显示使用AES运算法则的高强度密码方式
openssl ciphers -v 'AES+HIGH'[/quote]
[b][color=#4169E1]三、性能测试[/color][/b]
OpenSSL提供内置的性能测试组件,其通过speed选项,可以测试在一段时间内可以执行的操作数量,而不是测试固定数量操作的时间,这能确保即使是慢的系统,也不会花费过长的时间。
[b]1、如何进行性能测试[/b]
[quote]# 执行一个完整的性能测试
openssl speed
# 仅进行rsa的速度测试
openssl speed rsa
# 在一个SMP系统中,进行2路的rsa速度测试
openssl speed rsa -multi 2[/quote]
[b]2、如何测试远程连接的性能[/b]
使用s_time运行你测试远程连接的性能(30sec):[code]openssl s_time -connect remote.host:443[/code]除了简单的测试外,s_time也允许进行指定的测试项目:
[quote]# 使用新的session接收远程的test.html页面
openssl s_time -connect remote.host:443 -www /test.html -new
# 类似的,仅使用SSL v3版本和高强度的加密
openssl s_time \
-connect remote.host:443 -www /test.html -new \
-ssl3 -cipher HIGH
# 对比多个加密规则在10秒内连接的性能情况
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>&1 | \
grep bytes
echo
done[/quote]
如果你并没有SSL支持的Web服务器可以使用,你可以用s_server选项模拟:
[quote]# 主机一,建立服务端(默认使用4433端口)
openssl s_server -cert mycert.pem -www
# 主机二,通过s_time连接到指定的4433端口进行测试
openssl s_time -connect myhost:4433 -www / -new -ssl3[/quote][newpage]
[b][color=#4169E1]四、证书[/color][/b]
[b]1、如何创建一个self-signed证书[/b]
首先,你需要决定是否使用短语(passphrase)加密你的密钥。一方面,使用短语加密密钥可以更安全,可以即使密钥被盗也不能使用;但另一方面,这意味着在启动web或ldap服务前,你需要把短语保存到文件上,或者手动的输入。先以一个没有短语的密钥为例。
下面的例子创建一个包含私钥和公钥的mycert.pem文件,该证书有效期为365日,而使用-nodes表示为不加密的密钥:[code]openssl req \
-x509 -nodes -days 365 \
-newkey rsa:1024 -keyout mycert.pem -out mycert.pem[/code]使用该命令,你将需要回答一连串的问题:Country Name, State, City等,特别是Common Name,是一个非常重要的区分信息。如果你的web服务器实际主机名是mybox.mydomain.com,而人们访问的是使用[url]www.mydomain.com[/url]来访问,那么你应该使用[url]www.mydomain.com[/url]来填写Common Name。
使用-subj参数,可以更方便的填写这些信息:[code]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[/code][b]2、如何创建一个给VeriSign的证书[/b]
当为类似VeriSign的机构生成一个证书是比较复杂的官僚过程。在创建证书前,需要提交所有必须的文书文件。同上面一样,你必须考虑是否使用短语来加密你的密钥。下面都是假设你不使用这种方式。而得到一个叫mykey.pem的私钥文件,和myreq.pem的认证请求文件:[code]openssl req \
-new -newkey rsa:1024 -nodes \
-keyout mykey.pem -out myreq.pem[/code]如果你已经有私钥,而希望通过它生成认证请求文件,可以这样:[code]openssl req -new -key mykey.pem -out myreq.pem[/code]类似的,你也可以一同在命令行中提交证书信息:[code]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[/code]当处理类似VeriSign的机构,你需要特别留意,所提交的信息资料都必须正确无误。即使在Organization Name中的“and”和“&”区别都会引起麻烦。当你提交证书请求前,应double check一次:
[quote]# 校验签名
openssl req -in myreq.pem -noout -verify -key mykey.pem
# 检查信息
openssl req -in myreq.pem -noout -text[/quote]
请把密钥文件存放在安全的地方。你需要它来使用VeriSign发给你的信息。然后,在VeriSign上提交证书请求即可。
[b]3、我如何测试一个新的证书[/b]
使用s_server选项是最简单的测试方法。下面的例子假设你的密钥和证书都放在mycert.pem中。
首先,在测试端加载该证书,默认使用4433端口(可使用-accept选项修改):[code]openssl s_server -cert mycert.pem -www[/code]如果加载顺利,那么,你使用浏览器访问https://yourserver:4433/,你应该可以看到一个使用不同密码和关于你连接状态信息的页面。而大部分的浏览器也允许你测试该正式的有效性。
[b]4、我如何重新得到一个远程的证书[/b]
如果你懂openssl和sed,可以通过下面的脚本实现:
[quote]#!/bin/sh
#
# usage: retrieve-cert.sh remote.host.name [port]
#
REMHOST=$1
REMPORT=${2:-443}
echo |\
openssl s_client -connect ${REMHOST}:${REMPORT} 2>&1 |\
sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p'[/quote]
[b]5、如何从证书获得信息[/b]
一个SSL证书包括很多的信息,使用x509子命令,可以得到这些信息。下面的例子假设证书名称为:cert.pem。使用-text选项可以得到全部的信息:[code]openssl x509 -text -in cert.pem[/code]使用不同的参数,可以获得指定的数据:
[quote]# 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[/quote]
[b]6、如何导出或导入一个PKCS#12证书[/b]
PKCS#12可以有一些如IIS等的应用程序导出或导入。它们通常使用.pfx的扩展文件名。
要创建一个PKCS#12证书,你需要一个私钥和证书。在下面的转换过程中,你有机会为证书输入一个“Export Password”(也可以留空):
# 创建一个包括密钥和自签名的证书文件
[quote]openssl req \
-x509 -nodes -days 365 \
-newkey rsa:1024 -keyout mycert.pem -out mycert.pem
# 把mycert.pem导出为mycert.pfx的PKCS#12文件
openssl pkcs12 -export \
-out mycert.pfx -in mycert.pem \
-name "My Certificate"[/quote]
如果有人发给你的是PKCS#12文件(含Export Password),你也可以export它为标准的PEM格式:
# 导出证书和短语密钥[code]openssl pkcs12 -in mycert.pfx -out mycert.pem -nodes[/code]# 手动输入短语来导出证书[code]openssl pkcs12 -in mycert.pfx -out mycert.pem[/code][b][color=#4169E1]五、确认证书[/color][/b]
[b]1、如何验证一个证书[/b]
使用verify选项即可:[code]openssl verify cert.pem[/code]当验证通过,会显示OK信息:
[quote]$ openssl verify remote.site.pem
remote.site.pem: OK[/quote]
如果有错误,可得到简短的问题描述:
[quote]error 10 at 0 depth lookup:certificate has expired.
证书已经过期。
error 18 at 0 depth lookup:self signed certificate.
除非有例外,否则,OpenSSL不会校验一个自签名的证书。[/quote]
[b]2、有哪些证书发行者是OpenSSL认可的[/b]
当在OpenSSL安装到系统中时,会配置一个“Directory for OpenSSL files”目录(编译时,通过--openssldir参数指定)。该目录存放有系统相信的证书发行者。可以使用下面的命令得到:(以红旗DC Server 5.0为例)
[quote]$ openssl version -d
OPENSSLDIR: "/usr/share/ssl"[/quote]
在certs的目录和子目录中,你发现一到三种类型的文件:
cert.pem 一个大文件,是像VerSign和Thawte的机构通过的证书;
在certs子目录,有些小文件,是CA的;
一些比较模糊的文件,有类似052eae11.0的文件名,并链接向.pem文件的。这些文件的第一部分实际上是基于指向.pem文件的hash值,而文件的扩展名意义不大,因为它理论上可以由不同的证书来创建咯。
例如在我的Gentoo系统,有个f73e89fd.0的文件,其指向vsignss.pem,就有:
[quote]$ openssl x509 -noout -hash -in vsignss.pem
f73e89fd[/quote]
当一个程序处理一个远程的证书,它将检查cert.pem是否存在,不存在这创建hash值文件,存在,则校验该证书。
[b]3、如何让OpenSSL任何和校验一个证书[/b]
把文件放到certs目录,并创建hash值文件,下面的脚本做到这一点:
[quote]#!/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}" && continue
ln -s "$CERTFILE" "${HASH}.${ITER}"
test -L "${HASH}.${ITER}" && break
done
done[/quote]
[b][color=#4169E1]六、客户端和服务端的命令[/color][/b]
s_client和s_server选项提供一个方法执行SSL的客户端和服务端。
[b]1、如何连接一个安全的SMTP服务端[/b]
你可以使用s_client选项来连接一个SSL SMTP服务端。安全的SMTP使用3个端口:25(TLS),465(SSL),587(TLS)。0.9.7版本后,openssl可以通过-starttls来和smtp服务端通讯:
[quote]# 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[/quote]
大部分的邮件代理不区分<LF>或<CRLF>,但Qmail例外,所以,对于Qmail,可以这样:[code]openssl s_client -connect remote.host:25 -crlf -starttls smtp[/code][b]2、如何连接其他安全服务端[/b]
连接到不同的,但均使用SSL的服务端是相同的:
[quote]# 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[/quote]
[b]3、如何使用命令行建立一个SSL server[/b]
s_server可以实现这个目的。但更好的办法,是使用Stunnel代替:
[quote]# -www选项将返回一个HTML格式的页面给客户端
openssl s_server -cert mycert.pem -www
# -WWW选项模拟一个简单的web server,而使用当前目录的信息来返回给客户端。
# 在这个例子中,我们指定443端口代替默认的4433端口
openssl s_server -accept 443 -cert mycert.pem -WWW[/quote]
[b][color=#4169E1]七、dgst选项[/color][/b]
[b]1、如果创建一个文件的MD5或SHA1摘要[/b]
# MD5 digest
openssl dgst -md5 filename
# SHA1 digest
openssl dgst -sha1 filename
其结果和md5sum、sha1sum的结果是相同的。
[b]2、签名[/b]
如果你希望使用digest,实现没有你的私钥而不能修改文件的目的。下面的例子使用SHA1实现:
[quote]# 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[/quote]
而foo-1.23.tar.gz.sha1 就是foo-1.23.tar.gz的签名信息公钥。
[b]3、校验签名[/b]
要校验签名,需要有签名人的公钥:
[quote]# 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[/quote]
[b]4、创建Apache digest password entry[/b]
Apache使用特殊的密码格式,而使用htdigest组件,仅输出到文件,而非标准输出。当对于远端用户,它比较方便用户在他们信任的机器上创建密码。下面的脚本模拟htdigest的输出,并显示到标准输出:
[quote]#!/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)[/quote]
[b]5、其他可以使用的digest类型[/b]
通过下面的命令可以得到所有的列表:[code]openssl list-message-digest-commands[/code][newpage]
[b][color=#4169E1]七、加密和解密[/color][/b]
[b]1、使用base64编码[/b]
[quote]# 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[/quote]
命令行方式:[code]$ echo "encode me" | openssl enc -base64
ZW5jb2RlIG1lCg==[/code][color=#FF4500]※注意,echo默认会输出回车符,可使用-n参数屏蔽:[/color][code]$ echo -n "encode me" | openssl enc -base64
ZW5jb2RlIG1l[/code]解密使用-d参数:[code]$ echo "ZW5jb2RlIG1lCg==" | openssl enc -base64 -d
encode me[/code][b]2、如何简单地加密一个文件[/b]
使用cipher是一种比较简单的加密方式,下面的命令可以知道其支持的运算规则:[code]openssl list-cipher-commands[/code]当你选择号一个运算规则后,需要决定是否使用base64编码,以使用可打印字符来代替二进制方式的显示(例如要发送邮件),就可以这样做:
[quote]# 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 [color=#FF4500]-a[/color] -salt -in file.txt -out file.enc[/quote]
解密时,提供短语和对应的规则即可:
[quote]# 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[/quote]
如果你连短语也不想手动输入,可以使用“PASS PHRASE ARGUMENTS”格式:
[quote]# 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[/quote]
[b][color=#4169E1]八、错误[/color][/b]
如果你从日志中发现一些SSL的内容错误信息,例如:
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)
你应该把error和lib之间的代码提取出来,并查询:
$ openssl errstr 0407006A
error:0407006A:rsa routines:RSA_padding_check_PKCS1_type_1:block type is not 01
这样,再从manual里面去搜索信息,能比较好的解决问题。
[b][color=#4169E1]九、密钥[/color][/b]
[b]1、如果创建一个RSA密钥[/b]
使用genrsa选项:
[quote]# 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[/quote]
[b]2、如何创建一个RSA公钥[/b]
使用rsa选项,可以从私钥创建公钥:
openssl rsa -in mykey.pem -pubout
[b]3、如果创建一个DSA密钥[/b]
创建DSA密钥需要parameter file,而且验证比RSA要慢,所以使用范围没有RSA广泛。
如果你想创建一个单一的RSA密钥,可以:
[quote]# key will be called dsakey.pem
openssl dsaparam -noout -out dsakey.pem -genkey 1024[/quote]
另一方面,如果你希望多个DSA密钥共享一个parameter file,可以这样:
[quote]# 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[/quote]
[b]4、创建elliptic curve key[/b]
OpenSSL 0.9.8以上的版本才支持elliptic curve key:[code]openssl ecparam -out key.pem -name prime256v1 -genkey[/code]# -name 选型可以使用的参数,可通过下面的命令获得:[code]openssl ecparam -list_curves[/code][b]5、如何从一个密钥移除passphrase(短语)[/b]
依赖于你使用rsa或dsa方式,使用不同的处理方法。
假设你创建的RSA密钥,并放在单独的key.pem文件,那么下面的命令后,你就可以得到一个没有短语加密,但相同编码的RSA密钥newkey.pem
[quote]# you'll be prompted for your passphrase one last time
openssl rsa -in key.pem -out newkey.pem[/quote]
通常,私钥和公钥可以放在同一个文件。假设叫mycert.pem。通过下面的步骤,也可以得到没有短语的文件newcert.pem
[quote]# you'll need to type your passphrase once more
openssl rsa -in mycert.pem -out newcert.pem
openssl x509 -in mycert.pem >>newcert.pem[/quote][newpage]
[b][color=#4169E1]十、Password hashes[/color][/b]
使用passwd选项,你可以得到一个类似/etc/passwd或者/etc/shadow格式的密码。
1、创建一个crypt-style密码
[quote]$ openssl passwd MySecret
8E4vqBR4UOYF[/quote]
如果知道已经存在密码的“salt”,可以复制其hash:
[quote]$ openssl passwd -salt 8E MySecret
8E4vqBR4UOYF.[/quote]
否则,即使相同的密码,因每次的hash不同,结果也不同的。
2、创建一个shadow-style的密码
新的Unix系统(包括linux),都使用安全的MD5-based来作为salt,可以这样产生类似的密码:
[quote]$ openssl passwd -1 MySecret
$1$HkrAilcM$Jy3vYQc8UiEXfTLRrlSpD.[/quote]
而slat在二到三$符号之间,所以有:
[quote]$ openssl passwd -1 -salt HkrAilcM MySecret
$1$HkrAilcM$Jy3vYQc8UiEXfTLRrlSpD.[/quote]
[b][color=#4169E1]十一、Prime numbers(素数)[/color][/b]
从0.9.7e之后,prime选项被加入到openssl库中。
1、如何判断一个数字是否prime
使用prime选项即可。需要注意的是,返回的结果是十六进制,而非十进制形式的。
[quote]$ openssl prime 119054759245460753
1A6F7AC39A53511 is not prime
$ openssl prime -hex 2f
2F is prime[/quote]
2、如何创建一组prime numbers
[quote]# 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[/quote]
[b][color=#4169E1]十二、随机数[/color][/b]
使用rand选项可以得到二进制或base64编码后的随机数:
[quote]# 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[/quote]
从/dev/urandom可以得到类似的种子:
[quote]# get 32 bytes from /dev/urandom and base64 encode them
head -c 32 /dev/urandom | openssl enc -base64[/quote]
[b][color=#4169E1]十三、S/MIME[/color][/b]
S/MIME是发送和接收安全MIME的一个标准,常用于email中。通过OpenSSL的smime选项,可以提供命令行的S/MIME服务。
[b]1、如何校验一个已经签名的S/MIME信息[/b]
把收到的信息保存到msg.txt文件即可:[code]openssl smime -verify -in msg.txt[/code]如果发送人的证书被OpenSSL接受的,可以得到:
[quote]Verification successful.[/quote]
而如果内容被非认证架构修改,会得到错误信息:
[quote]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:[/quote]
而如果发送人的证书不在OpenSSL的识别范围内,也会出错:
[quote]Verification failure
9544:error:21075075:PKCS7 routines:PKCS7_verify:certificate verify
error:pk7_smime.c:222:Verify error:self signed certificate[/quote]大部分的邮件客户端,会随信息发送一个公共证书,从命令行也可以看到证书的信息:[code]openssl smime -pk7out -in msg.txt | \
openssl pkcs7 -text -noout -print_certs[/code]通过下面的命令,得到证书的copy[code]openssl smime -pk7out -in msg.txt -out her-cert.pem[/code]这样,你就可以再次利用它来验证[code]openssl smime -verify -in msg.txt -CAfile /path/to/her-cert.pem[/code][b]2、如何加密一个S/MIME信息[/b]
假设某人把她的公共证书发给你,并且要求你加密这些信息才给它。你应保存她的her-cert.pem文件。然后再reply。
为获得the default—though fairly weak—RC2-40 encryption,你应该告诉openssl信息和证书的位置[code]openssl smime her-cert.pem -encrypt -in my-message.txt[/code]如果你确认对方有robust SSL toolkit,你可以指定一个类似DES的运算法则来加密[code]openssl smime her-cert.pem -encrypt -des3 -in my-message.txt[/code]当使用sendmail时,可以一并来实现[code]openssl smime her-cert.pem \
-encrypt \
-des3 \
-in my-message.txt \
-from 'Your Fullname <you@youraddress.com>' \
-to 'Her Fullname <her@heraddress.com>' \
-subject 'My encrypted reply' |\
sendmail her@heraddress.com[/code][b]3、如何对S/MIME信息签名[/b]
如果你不想加密,而只是想签名,可以这样:[code]openssl smime \
-sign \
-signer /path/to/your-cert.pem \
-in my-message.txt \
-from 'Your Fullname <you@youraddress.com>' \
-to 'Her Fullname <her@heraddress.com>' \
-subject 'My signed reply' |\
sendmail her@heraddress.com[/code]唯一的区别,就是使用你自己的密钥和证书,而非发送者的证书咯。
原文备份:
[file]attachment/1196845674_0.txt[/file]
[b][color=#4169E1]十四、参考资料[/color][/b]
[url=http://www.madboa.com/geek/openssl/]http://www.madboa.com/geek/openssl/[/url]
[url=http://blog.csdn.net/wuhuiran/archive/2007/09/13/1783436.aspx]http://blog.csdn.net/wuhuiran/archive/2007/09/13/1783436.aspx[/url]
[[i] 本帖最后由 如是 于 2007-12-24 20:56 编辑 [/i]]
回复 1楼 的帖子
*** 作者被禁止或删除 内容自动屏蔽 *** 好.英语不错。 都能翻译成中文 :lol :lol好帖子为什么没有人学习呢?
页:
[1]