Dec 5

[译]OpenSSL Command-Line HOWTO 不指定

linuxing , 12:10 , 网络服务 » 安全相关 , 评论(0) , 引用(0) , 阅读(63507) , Via 本站原创 | |

四、证书
1、如何创建一个self-signed证书
首先,你需要决定是否使用短语(passphrase)加密你的密钥。一方面,使用短语加密密钥可以更安全,可以即使密钥被盗也不能使用;但另一方面,这意味着在启动web或ldap服务前,你需要把短语保存到文件上,或者手动的输入。先以一个没有短语的密钥为例。
下面的例子创建一个包含私钥和公钥的mycert.pem文件,该证书有效期为365日,而使用-nodes表示为不加密的密钥:
openssl req \
 -x509 -nodes -days 365 \
 -newkey rsa:1024 -keyout mycert.pem -out mycert.pem

使用该命令,你将需要回答一连串的问题:Country Name, State, City等,特别是Common Name,是一个非常重要的区分信息。如果你的web服务器实际主机名是mybox.mydomain.com,而人们访问的是使用www.mydomain.com来访问,那么你应该使用www.mydomain.com来填写Common Name。
使用-subj参数,可以更方便的填写这些信息:
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

2、如何创建一个给VeriSign的证书
当为类似VeriSign的机构生成一个证书是比较复杂的官僚过程。在创建证书前,需要提交所有必须的文书文件。同上面一样,你必须考虑是否使用短语来加密你的密钥。下面都是假设你不使用这种方式。而得到一个叫mykey.pem的私钥文件,和myreq.pem的认证请求文件:
openssl req \
 -new -newkey rsa:1024 -nodes \
 -keyout mykey.pem -out myreq.pem

如果你已经有私钥,而希望通过它生成认证请求文件,可以这样:
openssl req -new -key mykey.pem -out myreq.pem

类似的,你也可以一同在命令行中提交证书信息:
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

当处理类似VeriSign的机构,你需要特别留意,所提交的信息资料都必须正确无误。即使在Organization Name中的“and”和“&”区别都会引起麻烦。当你提交证书请求前,应double check一次:
引用
# 校验签名
openssl req -in myreq.pem -noout -verify -key mykey.pem
# 检查信息
openssl req -in myreq.pem -noout -text

请把密钥文件存放在安全的地方。你需要它来使用VeriSign发给你的信息。然后,在VeriSign上提交证书请求即可。
3、我如何测试一个新的证书
使用s_server选项是最简单的测试方法。下面的例子假设你的密钥和证书都放在mycert.pem中。
首先,在测试端加载该证书,默认使用4433端口(可使用-accept选项修改):
openssl s_server -cert mycert.pem -www

如果加载顺利,那么,你使用浏览器访问https://yourserver:4433/,你应该可以看到一个使用不同密码和关于你连接状态信息的页面。而大部分的浏览器也允许你测试该正式的有效性。
4、我如何重新得到一个远程的证书
如果你懂openssl和sed,可以通过下面的脚本实现:
引用
#!/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'

5、如何从证书获得信息
一个SSL证书包括很多的信息,使用x509子命令,可以得到这些信息。下面的例子假设证书名称为:cert.pem。使用-text选项可以得到全部的信息:
openssl x509 -text -in cert.pem

使用不同的参数,可以获得指定的数据:
引用
# 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

6、如何导出或导入一个PKCS#12证书
PKCS#12可以有一些如IIS等的应用程序导出或导入。它们通常使用.pfx的扩展文件名。
要创建一个PKCS#12证书,你需要一个私钥和证书。在下面的转换过程中,你有机会为证书输入一个“Export Password”(也可以留空):
# 创建一个包括密钥和自签名的证书文件
引用
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"

如果有人发给你的是PKCS#12文件(含Export Password),你也可以export它为标准的PEM格式:
# 导出证书和短语密钥
openssl pkcs12 -in mycert.pfx -out mycert.pem -nodes

# 手动输入短语来导出证书
openssl pkcs12 -in mycert.pfx -out mycert.pem

五、确认证书
1、如何验证一个证书
使用verify选项即可:
openssl verify cert.pem

当验证通过,会显示OK信息:
引用
$ openssl verify remote.site.pem
remote.site.pem: OK

如果有错误,可得到简短的问题描述:
引用
error 10 at 0 depth lookup:certificate has expired.
证书已经过期。
error 18 at 0 depth lookup:self signed certificate.
除非有例外,否则,OpenSSL不会校验一个自签名的证书。

2、有哪些证书发行者是OpenSSL认可的
当在OpenSSL安装到系统中时,会配置一个“Directory for OpenSSL files”目录(编译时,通过--openssldir参数指定)。该目录存放有系统相信的证书发行者。可以使用下面的命令得到:(以红旗DC Server 5.0为例)
引用
$ openssl version -d
OPENSSLDIR: "/usr/share/ssl"

在certs的目录和子目录中,你发现一到三种类型的文件:
cert.pem 一个大文件,是像VerSign和Thawte的机构通过的证书;
在certs子目录,有些小文件,是CA的;
一些比较模糊的文件,有类似052eae11.0的文件名,并链接向.pem文件的。这些文件的第一部分实际上是基于指向.pem文件的hash值,而文件的扩展名意义不大,因为它理论上可以由不同的证书来创建咯。
例如在我的Gentoo系统,有个f73e89fd.0的文件,其指向vsignss.pem,就有:
引用
$ openssl x509 -noout -hash -in vsignss.pem
f73e89fd

当一个程序处理一个远程的证书,它将检查cert.pem是否存在,不存在这创建hash值文件,存在,则校验该证书。
3、如何让OpenSSL任何和校验一个证书
把文件放到certs目录,并创建hash值文件,下面的脚本做到这一点:
引用
#!/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

六、客户端和服务端的命令
s_client和s_server选项提供一个方法执行SSL的客户端和服务端。
1、如何连接一个安全的SMTP服务端
你可以使用s_client选项来连接一个SSL SMTP服务端。安全的SMTP使用3个端口:25(TLS),465(SSL),587(TLS)。0.9.7版本后,openssl可以通过-starttls来和smtp服务端通讯:
引用
# 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

大部分的邮件代理不区分<LF>或<CRLF>,但Qmail例外,所以,对于Qmail,可以这样:
openssl s_client -connect remote.host:25 -crlf -starttls smtp

2、如何连接其他安全服务端
连接到不同的,但均使用SSL的服务端是相同的:
引用
# 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

3、如何使用命令行建立一个SSL server
s_server可以实现这个目的。但更好的办法,是使用Stunnel代替:
引用
# -www选项将返回一个HTML格式的页面给客户端
openssl s_server -cert mycert.pem -www
# -WWW选项模拟一个简单的web server,而使用当前目录的信息来返回给客户端。
# 在这个例子中,我们指定443端口代替默认的4433端口
openssl s_server -accept 443 -cert mycert.pem -WWW

七、dgst选项
1、如果创建一个文件的MD5或SHA1摘要
# MD5 digest
openssl dgst -md5 filename
# SHA1 digest
openssl dgst -sha1 filename
其结果和md5sum、sha1sum的结果是相同的。
2、签名
如果你希望使用digest,实现没有你的私钥而不能修改文件的目的。下面的例子使用SHA1实现:
引用
# 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

而foo-1.23.tar.gz.sha1 就是foo-1.23.tar.gz的签名信息公钥。
3、校验签名
要校验签名,需要有签名人的公钥:
引用
# 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

4、创建Apache digest password entry
Apache使用特殊的密码格式,而使用htdigest组件,仅输出到文件,而非标准输出。当对于远端用户,它比较方便用户在他们信任的机器上创建密码。下面的脚本模拟htdigest的输出,并显示到标准输出:
引用
#!/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)

5、其他可以使用的digest类型
通过下面的命令可以得到所有的列表:
openssl list-message-digest-commands
内文分页: [1] [2] [3] [4]
Tags: , , ,
发表评论
表情
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
打开HTML
打开UBB
打开表情
隐藏
记住我
昵称   密码   游客无需密码
网址   电邮   [注册]