最近在项目中用到了双向验证在没有好的测试证书的情况下,只能自给自足通过openssl分别生成私有签名的客户端和服务端证书用作测试。
流程:
1.安装openssl
openssl官网https://www.openssl.org/source/
下载你项目需要的版本,这里以 openssl-1.0.2n.tar.gz为例。
下载后找任意目录解压:tar -zxvf openssl-1.0.2n.tar.gz
然后进入解压后文件夹 cd openssl-1.0.2n
顺序执行:./config shared zlib
make&&make install
mv/usr/bin/openssl/usr/bin/openssl.bak mv/usr/include/openssl/usr/include/openssl.bak
ln-s /usr/local/ssl/bin/openssl/usr/bin/openssl
ln-s /usr/local/ssl/include/openssl/usr/include/openssl
echo“/usr/local/ssl/lib” >> /etc/ld.so.conf
(嫌麻烦的可以直接:yum install openssl)
安装好后进入ssl目录
cd /usr/local/ssl
把ssl目录下的openssl.cnf 拷贝到你需要生成证书的目录下,以bin目录为例
2.生成服务器端私钥(.key)
openssl genrsa -des3 -out server.key 1024
此时需要输入key的密码。这个时候因为在测试过程中如果有密码的话会每次都需要输入,所以我们会使用:openssl rsa -in server.key -out server_nopass.key转换一个没密码的key
3.生成服务器端csr文件
openssl req -new -key server_nopass.key -out server.csr -config openssl.cnf
生成的csr文件交给CA签名后会形成服务端自己的证书。
执行时会填写证书相关内容如下:
Country Name (2 letter code) [GB]:【在此输入两个字符的国家名。中国的为CN 】
State or Province Name (full name) [Berkshire]:【省份名称,如北京为beijing 】
Locality Name (eg, city) [Newbury]:【城市名称,如beijing】
Organization Name (eg, company) [My Company Ltd]:【公司名称】
Organizational Unit Name (eg, section) []:【部门名称】
Common Name (eg, your name or your server’s hostname) []:【姓名,通常即证书名】
Email Address []:【电子邮箱地址】
后面会让填写2个密码直接回车跳过。
4.使用相同方法生成客户端key和csr
openssl genrsa -des3 -out client.key 1024
openssl rsa -in client.key -out client_nopass.key
openssl req -new -key client_nopass.key -out server.csr -config openssl.cnf
5.自己做CA对证书进行签名
openssl req -new -x509 -keyout ca.key -out ca.crt -config openssl.cnf
自己手动创建一个CA目录结构:
mkdir ./demoCA
mkdir demoCA/newcerts
创建个空文件index.txt: vi demoCA/index.txt
创建serial后向文件中写入01: vi demoCA/serial
进入demoCA输入pwd查看当前目录路径,然后修改 openssl.cnf文件中“dir=”后面对应的路径。
6.用生成的CA的证书为刚才生成的server.csr,client.csr文件签名
openssl ca -in server.csr -out server.crt -cert ca.crt -keyfile ca.key -config openssl.cnf
openssl ca -in client.csr -out client.crt -cert ca.crt -keyfile ca.key -config openssl.cnf
证书生成完毕。
注:生成签名证书时候可能出现错误wrong number of fields on line 1 (looking for field 6, got 1, '' left)
原因是你的index.txt文件不为空,改为空文件即可,index.txt内不要有字符。
参考:1.http://blog.chinaunix.net/uid-20539097-id-64403.html
2.http://blog.chinaunix.net/uid-1838361-id-66391.html