linux ssl

证书制作

本章将详细讲解如何制作证书以及如何开启Https的单向、双向认证。

准备工作

选择任意路径,执行如下命令创建文件夹结构

 
  1. mkdir ca
  2. cd ca
  3. mkdir private
  4. mkdir server
  5. mkdir newcerts

在ca目录下创建openssl.conf文件,文件内容如下

 
  1. [ ca ]
  2. default_ca = foo # The default ca section
  3.  
  4. [ foo ]
  5. dir = /path/to/ca # top dir
  6. database = /path/to/ca/index.txt # index file.
  7. new_certs_dir = /path/to/ca/newcerts # new certs dir
  8.  
  9. certificate = /path/to/ca/private/ca.crt # The CA cert
  10. serial = /path/to/ca/serial # serial no file
  11. private_key = /path/to/ca/private/ca.key # CA private key
  12. RANDFILE = /path/to/ca/private/.rand # random number file
  13.  
  14. default_days = 365 # how long to certify for
  15. default_crl_days= 30 # how long before next CRL
  16. default_md = md5 # message digest method to use
  17. unique_subject = no # Set to 'no' to allow creation of
  18. # several ctificates with same subject.
  19. policy = policy_any # default policy
  20.  
  21. [ policy_any ]
  22. countryName = match
  23. stateOrProvinceName = match
  24. organizationName = match
  25. organizationalUnitName = match
  26. localityName = optional
  27. commonName = optional
  28. emailAddress = optional

其中,/path/to/ca/是ca目录的绝对路径。

创建ca证书

在ca目录下创建一个shell脚本,命名为new_ca.sh。文件内容如下:

 
  1. #!/bin/sh
  2. openssl genrsa -out private/ca.key
  3. openssl req -new -key private/ca.key -out private/ca.csr
  4. openssl x509 -req -days 365 -in private/ca.csr -signkey private/ca.key -out private/ca.crt
  5. echo FACE > serial
  6. touch index.txt
  7. openssl ca -gencrl -out private/ca.crl -crldays 7 -config "./openssl.conf"

执行sh new_ca.sh命令,创建ca证书。生成的证书存放于private目录中。

注意
在创建ca证书的过程中,需要输入一些信息。其中,countryName、stateOrProvinceName、organizationName、organizationalUnitName这四个选项的内容必须要填写,并且需要记住。在生成后续的证书过程中,要保证这四个选项的内容一致。

创建服务端证书

在ca目录下创建一个shell脚本,命名为new_server.sh。文件内容如下:

 
  1. #!/bin/sh
  2. openssl genrsa -out server/server.key
  3. openssl req -new -key server/server.key -out server/server.csr
  4. openssl ca -in server/server.csr -cert private/ca.crt -keyfile private/ca.key -out server/server.crt -config "./openssl.conf"

执行sh new_server.sh命令,创建ca证书。生成的证书存放于server目录中。

创建客户端证书

在ca目录下创建一个shell脚本,命名为new_client.sh。文件内容如下:

 
  1. #!/bin/sh
  2.  
  3. base="./"
  4. mkdir -p $base/users/
  5. openssl genrsa -des3 -out $base/users/client.key 1024
  6. openssl req -new -key $base/users/client.key -out $base/users/client.csr
  7. openssl ca -in $base/users/client.csr -cert $base/private/ca.crt -keyfile $base/private/ca.key -out $base/users/client.crt -config "./openssl.conf"
  8. openssl pkcs12 -export -clcerts -in $base/users/client.crt -inkey $base/users/client.key -out $base/users/client.p12

执行sh new_client.sh命令,创建ca证书。生成的证书存放于users目录中。
进入users目录,可以看到有一个client.p12文件,这个就是客户端可用的证书了,但是这个证书是不能在php中使用的,因此需要做一次转换。命令如下:

 
  1. openssl pkcs12 -clcerts -nokeys -out cer.pem -in client.p12
  2. openssl pkcs12 -nocerts -out key.pem -in client.p12

以上两个命令会生成cer.pem和key.pem两个文件。其中,生成key.pem时会要求设置密码,这里记为client_pwd

注意
如果在创建客户端证书时,就已经给client.p12设置了密码,那么在转换格式的时候,需要输入密码进行转换

最终结果

以上步骤执行结束后,会得到不少文件,其中需要用的文件如下表所示:

文件名路径说明
ca.crtca/private/ca证书
server.crtca/server/服务器端证书
server.keyca/server/服务器端秘钥
cer.pemca/client/客户端证书
key.pemca/client/客户端秘钥

SSL单向认证

Swoole开启SSL

Swoole开启SSL功能需要如下参数:

 
  1. $server = new swoole_server("127.0.0.1", "9501" , SWOOLE_PROCESS, SWOOLE_SOCK_TCP | SWOOLE_SSL );
  2. $server = new swoole_http_server("127.0.0.1", "9501" , SWOOLE_PROCESS, SWOOLE_SOCK_TCP | SWOOLE_SSL );

并在swoole的配置选项中增加如下两个选项:

 
  1. $server->set(array(
  2. 'ssl_cert_file' => '/path/to/server.crt',
  3. 'ssl_key_file' => '/path/to/server.key',
  4. ));

这时,swoole服务器就已经开启了单向SSL认证,可以通过https://127.0.0.1:9501/进行访问。

SSL双向认证

服务器端设置

双向认证指服务器也要对发起请求的客户端进行认证,只有通过认证的客户端才能进行访问。
为了开启SSL双向认证,swoole需要额外的配置参数如下:

 
  1. $server->set(array(
  2. 'ssl_cert_file' => '/path/to/server.crt',
  3. 'ssl_key_file' => '/path/to/server.key',
  4. 'ssl_client_cert_file' => '/path/to/ca.crt',
  5. 'ssl_verify_depth' => 10,
  6. ));

客户端设置

这里我们使用CURL进行https请求的发起。
首先,需要配置php.ini,增加如下配置:

 
  1. curl.cainfo=/path/to/ca.crt

发起curl请求时,增加如下配置项:

 
  1. $ch = curl_init();
  2.  
  3. curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, '2');
  4. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true); // 只信任CA颁布的证书
  5. curl_setopt($ch, CURLOPT_SSLCERT, "/path/to/cer.pem");
  6. curl_setopt($ch, CURLOPT_SSLKEY, "/path/to/key.pem");
  7. curl_setopt($ch, CURLOPT_SSLCERTTYPE, 'PEM');
  8. curl_setopt($ch, CURLOPT_SSLCERTPASSWD, '******'); // 创建客户端证书时标记的client_pwd密码

这时,就可以发起一次https请求,并且被swoole服务器验证通过了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值