您的位置:首页 > 运维架构

openssl生成pem数字证书

2013-04-13 17:06 423 查看
首先得安装OpenSSL软件包openssl,安装了这个软件包之后,我们可以做这些事情:

o Creation of RSA, DH and DSA Key Parameters # 创建密钥 key

o Creation of X.509 Certificates, CSRs and CRLs # 创建证书

o Calculation of Message Digests #

o Encryption and Decryption with Ciphers # 加密、解密

o SSL/TLS Client and Server Tests # SSL 服务器端/客户端测试

o Handling of S/MIME signed or encrypted Mail # 处理签名或加密了的邮件

1、生成RSA密钥的方法
openssl genrsa -des3 -out privkey.pem 2048

这个命令会生成一个2048位的密钥,同时有一个des3方法加密的密码,如果你不想要每次都输入密码,可以改成:

openssl genrsa -out privkey.pem 2048

建议用2048位密钥,少于此可能会不安全或很快将不安全。2、生成一个证书请求

openssl req -new -key privkey.pem -out cert.csr

这个命令将会生成一个证书请求,当然,用到了前面生成的密钥privkey.pem文件

这里将生成一个新的文件cert.csr,即一个证书请求文件,你可以拿着这个文件去数字证书颁发机构(即CA)申请一个数字证书。CA会给你一个新的文件cacert.pem,那才是你的数字证书。

如果是自己做测试,那么证书的申请机构和颁发机构都是自己。就可以用下面这个命令来生成证书:

openssl req -new -x509 -key privkey.pem -out cacert.pem -days 1095

这个命令将用上面生成的密钥privkey.pem生成一个数字证书cacert.pem

3、使用数字证书和密钥

有了privkey.pem和cacert.pem文件后就可以在自己的程序中使用了,比如做一个加密通讯的服务器

-------------

OpenSSL建立自己的CA

(1) 环境准备

首先,需要准备一个目录放置CA文件,包括颁发的证书和CRL(Certificate Revoke List)。

这里我们选择目录 /opt/ca。

然后我们在/opt/ca下建立两个目录,certs用来保存我们的CA颁发的所有的证书的副本;private用来保存CA证书的私钥匙。

CA的私钥匙很重要,至少需要2048位长度。建议保存在硬件里,或者至少不要放在网络中。

除了生成钥匙,在我们的CA体系中还需要创建三个文件。第一个文件用来跟踪最后一次颁发的证书的序列号,我们把它命名为serial,初始化为01。第二个文件是一个排序数据库,用来跟踪已经颁发的证书。我们把它命名为index.txt,文件内容为空。

$ mkdir /opt/myca

$ cd /opt/myca

$ mkdir certs private

$ chmod g-rwx,o-rwx private

$ echo "01" > serial

$ touch index.txt

第三个文件是OpenSSL的配置文件,创建起来要棘手点。示例如下:

[ ca ]

default_ca = myca

[ myca ]

dir = /opt/myca

certificate = $dir/cacert.pem

database = $dir/index.txt

new_certs_dir = $dir/certs

private_key = $dir/private/cakey.pem

serial = $dir/serial

default_crl_days= 7

default_days = 365

default_md = md5

policy = myca_policy

x509_extensions = certificate_extensions

[ myca_policy ]

commonName = supplied

stateOrProvinceName = supplied

countryName = supplied

emailAddress = supplied

organizationName= supplied

organizationalUnitName = optional

[ certificate_extensions ]

basicConstraints= CA:false

我们需要告诉OpenSSL配置文件的路径,有两种方法可以达成目的:通过config命令选项;通过环境变量OPENSSL_CONF。这里我们选择环境变量的方式。

$ OPENSSL_CONF="/opt/myca/openssl.cnf"

$ export OPENSSL_CONF

(2) 生成根证书(Root Certificate)

我们需要一个证书来为自己颁发的证书签名,这个证书可从其他CA获取,或者是自签名的根证书。这里我们生成一个自签名的根证书。

首先我们需要往配置文件里面添加一些信息,如下所示,节名和命令行工具的命令req一样。我们把所有必要的信息都写进配置,而不是在命令行输入,这是唯一指定X.509v3扩展的方式,也能让我们对如何创建根证书有个清晰的把握。

[ req ]

default_bits = 2048

default_keyfile = /opt/myca/private/cakey.pem

default_md = md5

prompt = no

distinguished_name = root_ca_distinguished_name

x509_extensions = root_ca_extensions

[ root_ca_distinguished_name ]

commonName = My Test CA

stateOrProvinceName = Beijing

countryName = CN

emailAddress = yingyuan@staff.sina.com.cn

organizationName = Root Certification Authority

[ root_ca_extensions ]

basicConstraints = CA:true

万事俱备,我们可以生成根证书了。注意设置好环境变量OPENSSL_CONF。

$ openssl req -x509 -newkey rsa -out cacert.pem -outform PEM

验证一下我们生成的文件。

$ openssl x509 -in cacert.pem -text -noout

(3) 给客户颁发证书

在给客户颁发证书之前,需要客户提供证书的基本信息。我们另外开启一个终端窗口,使用默认的OpenSSL配置文件(不要让之前的OPENSSL_CONF干扰我们,那个配置是专门用来生成根证书的)。

命令和我们生成根证书的类似,都是req,不过需要提供一些额外的信息。如下:

$ openssl req -newkey rsa:1024 -keyout testkey.pem -keyform PEM -out testreq.pem -outform PEM

有两次提示要口令,第一次的口令用来加密私钥匙testkey.pem,第二次口令一般被OpenSSL忽略。

结果生成两个文件:testkey.pem,私钥匙;testreq.pem,请求信息,其中包括公钥匙。

我们来看看testreq.pem都有哪些信息?

$ openssl req -in testreq.pem -text -noout

现在,我们可以把testreq.pem提交给我们的CA生成证书了。

为了方便起见,我们假定testreq.pem在/opt/myca/private/中。

$ openssl ca -in testreq.pem

有三次提示,一次是问你CA的私钥匙密码,两次是确认,输出的结果就是为客户颁发的证书。

可以通过batch选项取消命令提示,可通过notext选项取消证书的输出显示。

此外,还可以一次给多个客户颁发证书,方法是用 infiles选项替换in选项,不过这个选项必须放在最后,因为此后的任何字符均被处理为文件名称列表。

生成的证书放在certs目录,同时index.txt和serial的内容都发生了改变。

(4) 吊销证书

吊销证书的操作很简单,我们将待吊销的证书从证书的保存位置拷贝到另外一个目录,然后运行ca命令就可以。

主要设置好OPENSSL_CONF环境变量。

$ cp certs/01.pem testcert.pem

$ openssl ca -revoke testcert.pem

输入CA私钥匙的密码就可以。

为了使你的吊销操作让别人知道,你可以生成CRL(Certificate Revoke List),然后公布到网上去。

由于每个颁发的证书都有一个过期时间,一旦证书过期了,就可以把该证书从CRL中删除。因为这时候在不在CRL中已经无所谓了。

# 生成CRL列表

$ openssl ca -gencrl -out exampleca.crl

# 查看CRL列表信息

$ openssl crl -in exampleca.crl -text -noout

# 验证CRL列表签名信息

$ openssl crl -in exampleca.crl -noout -CAfile cacert.pem

可以看到CRL的版本号为1,这是OpenSSL默认的,除非crl_extensions被指定在配置文件ca一节中。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: