我为楼梯下托管的一个小型 Apache 服务器生成自签名客户端证书。为了这个目的,下面的脚本被一起破解了——注意它使用'mini-CA' x509 方法,因此在index.txt中没有记录任何内容。
现在我需要撤销一个这样的客户端证书,这需要生成一个 CRL 并将其添加到 Apache。然而,CRL 生成似乎需要一个 index.txt:
root@myserver:~# openssl ca -cert "ssl_ca/ca.crt" -keyfile "ssl_ca/ca.key" -revoke "ssl_badguy/badguy.p12"
./demoCA/index.txt: No such file or directory
unable to open './demoCA/index.txt'
根据证书创建,是否有“独立”CRL 生成命令?我不关心 CA 的持久性或尊重正确的 SSL“理论”(否则一开始就没有自签名)。最初我只是想保护和控制对我的服务器的访问;现在我只想撤销一些访问权限。
当按照./clientcert.sh certname 调用时,以下脚本会创建一个包含所有 bumf(包括 PKCS12)的新目录 /root/ssl_certname/。
#! /bin/bash
echo 'When it asks for a key password (3 times), recommend you use the new key name'
echo 'When it asks for cert details, use "." (blank) for all, EXCEPT CN, which should'
echo 'also be the key name. All other passwords ("Export" etc.) are blank'
clientname="$1"
newdir="/root/ssl_$1"
caloc="/root/ssl_ca"
cert="$newdir/$1"
if [ -d "$newdir" ]; then
echo "$newdir already exists!"
else
mkdir "$newdir"
cd "$caloc"
openssl genrsa -des3 -out "$cert.key" 2048
openssl rsa -in "$cert.key" -out "$cert.key.insecure"
mv "$cert.key" "$cert.key.secure"
mv "$cert.key.insecure" "$cert.key"
openssl req -new -key "$cert.key" -out "$cert.csr"
openssl x509 -req -days 365 -CA ca.crt -CAkey ca.key -CAcreateserial -in "$cert.csr" -out "$cert.crt"
openssl pkcs12 -export -clcerts -in "$cert.crt" -inkey "$cert.key" -out "$cert.p12"
fi
编辑:从技术上讲并不能解决问题,但通过将以下内容添加到我的default-ssl vhost 中,我实现了同样的目标:
# Block badguy client cert
Rewritecond %{SSL:SSL_CLIENT_S_DN_CN} =badguy
RewriteRule (.*) /blocked [QSA,R,L]
- /blocked 实际上不存在的地方(我想我可以在那里放置一个保留页面)。