Shell脚本实现生成SSL自签署证书
启用apache的mod_ssl之后需要有证书才能正常运作。写了个脚本来操作。首先要确定机器上已经有openssl。
#!/bin/sh #
#ssl证书输出的根目录。 sslOutputRoot="/etc/apache_ssl" if[$#-eq1];then sslOutputRoot=$1 fi if[!-d${sslOutputRoot}];then mkdir-p${sslOutputRoot} fi
cd${sslOutputRoot}
echo"开始创建CA根证书..." # #创建CA根证书,稍后用来签署用于服务器的证书。如果是通过商业性CA如 #Verisign或Thawte签署证书,则不需要自己来创建根证书,而是应该 #把后面生成的服务器csr文件内容贴入一个web表格,支付签署费用并 #等待签署的证书。关于商业性CA的更多信息请参见: #Verisign-http://digitalid.verisign.com/server/apacheNotice.htm #ThawteConsulting-http://www.thawte.com/certs/server/request.html #CertiSignCertificadoraDigitalLtda.-http://www.certisign.com.br #IKSGmbH-http://www.iks-jena.de/produkte/ca/ #UptimeCommerceLtd.-http://www.uptimecommerce.com #BelSignNV/SA-http://www.belsign.be #生成CA根证书私钥 opensslgenrsa-des3-outca.key1024
#生成CA根证书 #根据提示填写各个字段,但注意CommonName最好是有效根域名(如zeali.net), #并且不能和后来服务器证书签署请求文件中填写的CommonName完全一样,否则会 #导致证书生成的时候出现 #error18at0depthlookup:selfsignedcertificate错误 opensslreq-new-x509-days365-keyca.key-outca.crt echo"CA根证书创建完毕。"
echo"开始生成服务器证书签署文件及私钥..." # #生成服务器私钥 opensslgenrsa-des3-outserver.key1024 #生成服务器证书签署请求文件,CommonName最好填写使用该证书的完整域名 #(比如:security.zeali.net) opensslreq-new-keyserver.key-outserver.csr ls-altrh ${sslOutputRoot}/server.* echo"服务器证书签署文件及私钥生成完毕。"
echo"开始使用CA根证书签署服务器证书签署文件..." # #签署服务器证书,生成server.crt文件 #参见http://www.faqs.org/docs/securing/chap24sec195.html # sign.shSTART # # SignaSSLCertificateRequest(CSR) # Copyright(c)1998-1999RalfS.Engelschall,AllRightsReserved. #
CSR=server.csr
case$CSRin *.csr)CERT="`echo$CSR|sed-e's/\.csr/.crt/'`";; *)CERT="$CSR.crt";; esac
# makesureenvironmentexists if[!-dca.db.certs];then mkdirca.db.certs fi if[!-fca.db.serial];then echo'01'>ca.db.serial fi if[!-fca.db.index];then cp/dev/nullca.db.index fi
# createanownSSLeayconfig #如果需要修改证书的有效期限,请修改下面的default_days参数. #当前设置为10年. cat>ca.config<<EOT [ca] default_ca =CA_own [CA_own] dir =. certs =./certs new_certs_dir =./ca.db.certs database =./ca.db.index serial =./ca.db.serial RANDFILE =./ca.db.rand certificate =./ca.crt private_key =./ca.key default_days =3650 default_crl_days =30 default_md =md5 preserve =no policy =policy_anything [policy_anything] countryName =optional stateOrProvinceName =optional localityName =optional organizationName =optional organizationalUnitName =optional commonName =supplied emailAddress =optional EOT
# signthecertificate echo"CAsigning:$CSR->$CERT:" opensslca-configca.config-out$CERT-infiles$CSR echo"CAverifying:$CERT<->CAcert" opensslverify-CAfile./certs/ca.crt$CERT
# cleanupafterSSLeay rm-fca.config rm-fca.db.serial.old rm-fca.db.index.old # sign.shEND echo"使用CA根证书签署服务器证书签署文件完毕。"
#使用了ssl之后,每次启动apache都要求输入server.key的口令, #你可以通过下面的方法去掉口令输入(如果不希望去掉请注释以下几行代码): echo"去除apache启动时必须手工输入密钥密码的限制:" cp-fserver.keyserver.key.org opensslrsa-inserver.key.org-outserver.key echo"去除完毕。"
#修改server.key的权限,保证密钥安全 chmod400server.key
echo"Nowucanconfigureapachesslwithfollowing:" echo-e"\tSSLCertificateFile${sslOutputRoot}/server.crt" echo-e"\tSSLCertificateKeyFile${sslOutputRoot}/server.key"
# diegracefully exit0