<p>Step 1. Create key (password protected)</p><p></p><p>openssl genrsa -out prvtkey.pem 1024/2038 (with out password protected) </p><p>openssl genrsa -des3 -out prvtkey.pem 1024/2048 (password protected)</p><p>这个命令会生成一个1024/2048位的密钥。</p><p>Step 2. Create certification request</p><p>openssl req -new -key prvtkey.pem -out cert.csr</p><p>openssl req -new -nodes -key prvtkey.pem -out cert.csr</p><p>这个命令将会生成一个证书请求,当然,用到了前面生成的密钥prvtkey.pem文件</p><p>这里将生成一个新的文件cert.csr,即一个证书请求文件,你可以拿着这个文件去数字证书颁发机构(即CA)申请一个数字证书。CA会给你一个新的文件cacert.pem,那才是你的数字证书。</p><p>Step 3: Send certificate request to Certification Authority (CA)</p><p>如果是自己做测试,那么证书的申请机构和颁发机构都是自己。就可以用下面这个命令来生成证书:</p><p>openssl req -new -x509 -key prvtkey.pem -out cacert.pem -days 1095</p><p>这个命令将用上面生成的密钥privkey.pem生成一个数字证书cacert.pem</p><p></p><p></p><p>cacert.pem 生成过程见&quot;OpenSSL建立自己的CA&quot;</p><p></p><p>有了privkey.pem和cacert.pem文件后就可以在自己的程序中使用了,比如做一个加密通讯的服务器</p><p>-------------</p><p>OpenSSL建立自己的CA</p><p></p><p></p><p>(1) 环境准备</p><p>首先,需要准备一个目录放置CA文件,包括颁发的证书和CRL(Certificate Revoke List)。</p><p>这里我们选择目录 /var/MyCA。</p><p>然后我们在/var/MyCA下建立两个目录,certs用来保存我们的CA颁发的所有的证书的副本;private用来保存CA证书的私钥匙。</p><p>除了生成钥匙,在我们的CA体系中还需要创建三个文件。第一个文件用来跟踪最后一次颁发的证书的序列号,我们把它命名为serial,初始化为01。第二个文件是一个排序数据库,用来跟踪已经颁发的证书。我们把它命名为index.txt,文件内容为空。</p><p>$ mkdir /var/MyCA</p><p>$ cd /var/MyCA</p><p>$ mkdir certs private</p><p>$ chmod g-rwx,o-rwx private</p><p>$ echo &quot;01&quot; &gt; serial</p><p>$ touch index.txt</p><p>第三个文件是OpenSSL的配置文件,创建起来要棘手点。示例如下:</p><p>$ touch openssl.cnf</p><p>文件内容如下:</p><p>[ ca ]</p><p>default_ca = myca</p><p>[ myca ]</p><p>dir = /var/MyCA</p><p>certificate = $dir/cacert.pem</p><p>database = $dir/index.txt</p><p>new_certs_dir = $dir/certs</p><p>private_key = $dir/private/cakey.pem</p><p>serial = $dir/serial</p><p>default_crl_days= 7</p><p>default_days = 365</p><p>default_md = md5</p><p>policy = myca_policy</p><p>x509_extensions = certificate_extensions</p><p>[ myca_policy ]</p><p>commonName = supplied</p><p>stateOrProvinceName = supplied</p><p>countryName = supplied</p><p>emailAddress = supplied</p><p>organizationName= supplied</p><p>organizationalUnitName = optional</p><p>[ certificate_extensions ]</p><p>basicConstraints= CA:false</p><p>我们需要告诉OpenSSL配置文件的路径,有两种方法可以达成目的:通过config命令选项;通过环境变量OPENSSL_CONF。这里我们选择环境变量的方式。</p><p>$ OPENSSL_CONF=/var/MyCA/openssl.cnf&quot;</p><p>$ export OPENSSL_CONF</p><p>(2) 生成根证书 (Root Certificate)</p><p>我们需要一个证书来为自己颁发的证书签名,这个证书可从其他CA获取,或者是自签名的根证书。这里我们生成一个自签名的根证书。</p><p>首先我们需要往配置文件里面添加一些信息,如下所示,节名和命令行工具的命令req一样。我们把所有必要的信息都写进配置,而不是在命令行输入,这是唯一指定X.509v3扩展的方式,也能让我们对如何创建根证书有个清晰的把握。</p><p>[ req ]</p><p>default_bits = 2048</p><p>default_keyfile = /var/MyCA/private/cakey.pem</p><p>default_md = md5</p><p>prompt = no</p><p>distinguished_name = root_ca_distinguished_name</p><p>x509_extensions = root_ca_extensions</p><p>[ root_ca_distinguished_name ]</p><p>commonName = My Test CA</p><p>stateOrProvinceName = HZ</p><p>countryName = CN</p><p>emailAddress = test@cert.com</p><p>organizationName = Root Certification Authority</p><p>[ root_ca_extensions ]</p><p>basicConstraints = CA:true</p><p>万事俱备,我们可以生成根证书了。注意设置好环境变量OPENSSL_CONF。</p><p>$ openssl req -x509 -newkey rsa -out cacert.pem -outform PEM -days 356</p><p>注:&quot;-days 356&quot;控制有效期限为365天,默认为30天。</p><p>验证一下我们生成的文件。</p><p>$ openssl x509 -in cacert.pem -text -noout</p><p>(3) 给客户颁发证书</p><p>在给客户颁发证书之前,需要客户提供证书的基本信息。我们另外开启一个终端窗口,使用默认的OpenSSL配置文件(不要让之前的OPENSSL_CONF干扰我们,那个配置是专门用来生成根证书的)。</p><p>命令和我们生成根证书的类似,都是req,不过需要提供一些额外的信息。如下:</p><p>$ openssl req -newkey rsa:1024 -keyout testkey.pem -keyform PEM -out testreq.pem -outform PEM</p><p>有两次提示要口令,第一次的口令用来加密私钥匙testkey.pem,第二次口令一般被OpenSSL忽略。</p><p>结果生成两个文件:testkey.pem,私钥匙;testreq.pem,请求信息,其中包括公钥匙。</p><p>我们来看看testreq.pem都有哪些信息?</p><p>$ openssl req -in testreq.pem -text -noout</p><p>现在,我们可以把testreq.pem提交给我们的CA生成证书了。</p><p>为了方便起见,我们假定testreq.pem在//var/MyCA/private/中。</p><p>$ openssl ca -in testreq.pem</p><p>有三次提示,一次是问你CA的私钥匙密码,两次是确认,输出的结果就是为客户颁发的证书。</p><p>可以通过batch选项取消命令提示,可通过notext选项取消证书的输出显示。</p><p>此外,还可以一次给多个客户颁发证书,方法是用 infiles选项替换in选项,不过这个选项必须放在最后,因为此后的任何字符均被处理为文件名称列表。</p><p>生成的证书放在certs目录,同时index.txt和serial的内容都发生了改变。</p>
返回顶部 留言