配置客户端证书身份认证(mTLS).note
一、apache2配置客户端证书身份认证:
(1)配置 apache2:
vim /etc/apache2/sites-enabled/000-default.conf
在 /usr/share/doc/apache2/下有配置摘抄:
grep -r SSLVerify /usr/share/doc/apache2/examples/*

# 参数解释:
SSLCACertificateFile [file] //指定一个用于验证ca根证书,apache会用该ca来验证客户端证书是否合法(如果客户端证书是由子CA签发,则该文件需要包含根CA的证书和子CA的证书)
SSLVerifyClient require //强制要求客户端在建立SSL连接时提供有效的证书
选项:
none: 不验证客户端证书(默认)
optional:客户端可选择提供证书,但是证书无效会拒绝连接
require:客户端必须提供有效证书,否则拒绝连接
SSLVerifyDepth [number] //值为 1(默认为1)就只允许根证书颁发的证书验证,值为2就能够允许根证书下的一个子CA颁发的证书进行验证,值为3就允许根CA下的子CA下的子CA颁发的证书进行验证(2)将Web证书导出为 pkcs12格式文件:
# openssl pkcs12 -export -out [转换后的pkcs12文件名] -in [要被转换的证书文件] -inkey [要被转换证书的私钥] -certfile [ca根证书]
openssl pkcs12 -export -out client.p12 -in skill39.crt -inkey skill39.key -certfile ca.crt将它拷贝给客户端
(3)客户端导入pkcs12格式证书:
cp client.p12 /home/user
chmod 755 /home/user/client.p12打开火狐浏览器导入证书:



输入前面生成时输入的密码:


·客户端测试访问:
可以看到弹出了证书选择页面,点击OK

访问成功:

如果没有证书,或者取消选择证书就会报错:

二、在子目录配置 客户端证书身份认证:
# 将客户端证书身份认证配置在子目录时,会因为TLS 1.3导致下面的问题:
因为客户端再访问到网站根目录时,TLS握手已经完成,但是配置了这个之后,在访问子目录时,apache会要求客户端再进行一次TLS协商,在TLS 1.2时,可以进行 TLS Renegotiation(TLS重新协商),但是现在web默认使用的都是TLS 1.3,TLS 1.3中取消了renegotiation,这样就会导致子目录TLS协商失败,无法访问
所以解决方案就是,上面的配置方式 + 禁用 TLS 1.31、禁用TLS 1.3:
vim /etc/apache2/apache2.conf
# 取消 TLS 1.3协议:
# 或:SSLProtocol -all +TLSv1.2
模板在:/etc/apache2/mods-available/ssl.conf 中:

2、为子目录配置 客户端证书身份认证:
配置和上面的一样,只不过应用在子目录中
需要注意,CA的定义不能定义在子目录中
vim /etc/apache2/sites-enabled/000-default.conf
# 使用<Directory /var/www/managers> 定义子目录的绝对路径
systemctl restart apache2
模板:grep -r SSL /usr/share/doc/apache2/*
需要安装 apache2-doc


·测试:
访问主目录时不需要证书:

访问子目录时需要证书:

不使用证书无法访问到子目录

选择证书后访问成功:

