Apache/Nginx开启SSL双向认证

OpenSSL生成密钥证书

如果是付费的一般都会有现成的密钥证书,可以略过此步。

1.1 进入openssl目录

1
# cd <openssl目录路径>

在要生成证书的目录下建立几个文件和文件夹,目录结构如下

1
2
3
4
|-- demoCA
|-- demoCA/newcerts
|-- demoCA/index.txt
|-- demoCA/serial

在serial文件中写入第一个序列号“01”

1.2 设置openssl配置文件地址

1
# set OPENSSL_CONF= <配置文件地址>

1.3 生成CA根证书

1
# openssl req -new -x509 -keyout ca.key -out ca.crt -days 8000

输入以上命令后,按提示依次国家缩写、省名、城市名、公司名、部门名、主机名、邮箱
Ps:以上各选项只能输入英文,不然会乱码

1.4 生成客户端密钥

1
# openssl genrsa -out client.key 1024

1.5 生成证书请求

1
# openssl req -new -out client.csr -key client.key

输入以上命令后,按提示依次国家缩写、省名、城市名、公司名、部门名、主机名、邮箱、密码、公司别名
Ps:以上各选项只能输入英文,不然会乱码

1.6 用CA证书为server.csr做签名

1
# openssl ca -in client.csr -out client.crt -cert ca.crt -keyfile ca.key -days 8000

1.7 导出成浏览器能导入的证书

1
# openssl pkcs12 -export -inkey client.key -in client.crt -out client.p12

这里需要输入密码(这里的密码就是导入证书时要用到的密码)

这一步主要是生成一个可导入的证书,如果只是想开启单向认证可以略过此步。

1.8 移动证书与密钥

我们将当前目录下的 ca.crt、ca.key、client.csr、client.crt、client.key、client.p12 都拷贝到 conf/ssl-client 目录下,没有就创建。

Apache开启方法

2.1 修改 http.conf 文件

2.1.1 添加443端口的监听
1
Listen 443

2.1.2 去掉下面行首的 # 号(加入ssl模块)

1
#LoadModule ssl_module modules/mod_ssl.so

2.2 修改需要开启ssl的域名配置文件(示例)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<VirtualHost *:443>
ServerAdmin www.test.com
DocumentRoot "D:/wamp/www/test"
ServerName test.com
ErrorLog "logs/test.com-error.log"
CustomLog "logs/test.com-access.log" common
# 开启HTTPS
SSLEngine on
SSLCertificateFile "<server.crt本地路径>"
SSLCertificateKeyFile "<server.key本地路径>"
# 开启双向认证
SSLCACertificateFile "<ca.crt路径>"
SSLCertificateChainFile "<client.crt路径>"
SSLVerifyClient require
SSLVerifyDepth 10
<Directory "D:/wamp/www/test">
AllowOverride None
Options None
Order allow,deny
Allow from all
</Directory>
</VirtualHost>

以上步骤完成后,重启Apache。这时再访问我们的网址就会提示 SSL 连接出错 ,我们只要双击刚刚生成的 client.p12 证书进行导入后,就可以正常访问了。

如果在Windows下遇到Apache启动不了的情况,可以进入 我的电脑->管理->事件检查器->应用程序日志 ,打开apache的错误报告,会有提示哪里出错了,一般都可以找到原因。

Nginx 开启方法

Nginx开启相对简单,只要修改配置文件就可以了。

配置文件基本内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
server {
# 开启HTTPS
ssl on;
ssl_certificate <client.crt路径>
ssl_certificate_key <server.key路径>
ssl_protocols SSLv3 TLSv1;
ssl_ciphers HIGH:!ADH:!EXPORT56:RC4+RSA:+MEDIUM;
ssl_prefer_server_ciphers on;
# 开启双向认证
ssl_verify_client on;
ssl_client_certificate <ca.crt路径>
location ~ \.php{
# PHP开启HTTPS
fastcgi_param HTTPS on;
}
}

以上的目录路径和文件名都是可以自定义的,不一定要按照我的来。