自建CA搭建HTTPS及域名配置
一、openssl介绍
openssl: 多用途的命令行工具,包openssl,可以执行交互或批量命令。
openssl可以实现:秘钥证书管理、对称加密和非对称加密 。
二、自建CA搭建HTTPS服务器
注:如果希望搭建的服务器有域名请先看下面的 三、修改域名
创建CA 证书颁发机构
首先,创建原始工作环境,例如在你的家目录下执行以下命令:
cd && mkdir -p myCA/signedcerts && mkdir myCA/private && cd myCA
上述命令将在你的家目录下创建一个myCA目录,在这个目录下有 signedcerts和private两个子目录。其中:
-
~/myCA : 用来存放 CA 证书, 证书数据库, 产生证书, 秘钥和请求
-
~/myCA/signedcerts : 存放所有签名证书的副本
-
~/myCA/private : 存放CA的私钥
下一步,在~/myCA目录下 创建一个原始证书数据库,serial(证书签名序列号,存放下一个要签名的证书的序号)这里写入01,表示从01开始:
echo '01' > serial && touch index.txt
创建一个原始的CA配置文件 caconfig.cnf 。 编辑 ~/myCA/caconfig.cnf, 将以下内容写入文件并保存:
sudo vim ~/myCA/caconfig.cnf
# My sample caconfig.cnf file. # # Default configuration to use when one is not provided on the command line. # [ ca ] default_ca = local_ca # # # Default location of directories and files needed to generate certificates. # [ local_ca ] dir = /home/<username>/myCA certificate = $dir/cacert.pem database = $dir/index.txt new_certs_dir = $dir/signedcerts private_key = $dir/private/cakey.pem serial = $dir/serial # # # Default expiration and encryption policies for certificates. # default_crl_days = 365 default_days = 1825 default_md = SHA256 #签名摘要算法 # policy = local_ca_policy x509_extensions = local_ca_extensions # # # Copy extensions specified in the certificate request # copy_extensions = copy # # # Default policy to use when generating server certificates. The following # fields must be defined in the server certificate. #match 表示openssl ca要签署的证书请求文件中的项要和CA证书中的项匹配,即要相同, #supplied表示必须要提供的项, #optional表示可选项,所以可以留空 # [ local_ca_policy ] commonName = supplied stateOrProvinceName = supplied countryName = supplied emailAddress = supplied organizationName = supplied organizationalUnitName = supplied # # # x509 extensions to use when generating server certificates. # [ local_ca_extensions ] basicConstraints = CA:false subjectAltName = DNS:localhost nsCertType = server # # # The default root certificate generation policy. # [ req ] default_bits = 2048 default_keyfile = /home/<username>/myCA/private/cakey.pem default_md = SHA256 # prompt = no distinguished_name = root_ca_distinguished_name x509_extensions = root_ca_extensions # # # Root Certificate Authority distinguished name. Change these fields to match # your local environment! # [ root_ca_distinguished_name ] commonName = MyOwn Root Certificate Authority stateOrProvinceName = JS countryName = CN emailAddress = root@tradeshowhell.com organizationName = Trade Show Hell organizationalUnitName = IT Department # [ root_ca_extensions ] basicConstraints = CA:true
注意:不要忘记将[ local_ca ] 和 [ req ] 下 /home/<username>/··· <username>修改为自己的主机名 。可以 修改 [ root_ca_distinguished_name ] 下 commonName, stateOrProvinceName countryName 等以针对您的环境进行个性化设置
生成证书颁发机构根证书和密钥
首先设置一个环境变量OPENSSL_CONF,该变量强制openssl工具在备用位置(本例为〜/ myCA / caconfig.cnf)中查找配置文件:
export OPENSSL_CONF=~/myCA/caconfig.cnf
生成 CA 证书和秘钥:
openssl req -x509 -newkey rsa:2048 -out cacert.pem -outform PEM -days 1825
你将被提示输入密码, 并且看到如下结果:
Generating a 2048 bit RSA private key ....+++ ..................................................................................................+++ writing new private key to '/home/farsight/myCA/private/cakey.pem' Enter PEM pass phrase: Verifying - Enter PEM pass phrase: -----
牢记你设置密码!每次生成并签署新的服务器或客户端证书时,都需要用到它!
上述过程使用RSA公/私钥加密创建PEM格式的自签名证书。该证书有效期为1825天。文件的位置和作用如下:
-
〜/ myCA / cacert.pem:CA证书
-
〜/ myCA / private / cakey.pem:CA私钥
可选步骤:
从证书的所有文本中剥离证书,仅保留-CERTIFICATE-部分以创建crt
openssl x509 -in cacert.pem -out cacert.crt
创建自签名服务器证书
创建服务器配置文件 〜/ myCA / exampleserver.cnf 写入并保存以下内容
# #exampleserver.cnf # [ req ] prompt = no distinguished_name = server_distinguished_name #req_extensions = v3_req [ server_distinguished_name ] commonName = localhost stateOrProvinceName = JS countryName = CN emailAddress = root@tradeshowhell.com organizationName = My Organization Name organizationalUnitName = Subunit of My Large Organization [ v3_req ] basicConstraints = CA:FALSE keyUsage = nonRepudiation, digitalSignature, keyEncipherment #subjectAltName = @alt_names #[ alt_names ] #DNS.0 = tradeshowhell.com #DNS.1 = alt.tradeshowhell.com
注:确保更改 [server_distinguished_name] 下的值,尤其是commonName值。COMMONNAME值必须与主机名匹配。如果commonName与预期的主机名不匹配,则主机/证书不匹配错误将出现在尝试访问服务器的客户端的客户端应用程序中。这里已经修改为正确的commonName,不用进行修改
更改环境变量:
export OPENSSL_CONF=~/myCA/exampleserver.cnf
生成服务器临时证书和秘钥:
openssl req -newkey rsa:1024 -keyout tempkey.pem -keyform PEM -out tempreq.pem -outform PEM
你将被提示输入密码, 并且看到如下结果:
Generating a 1024 bit RSA private key .......................................++++++ ............................++++++ writing new private key to 'tempkey.pem' Enter PEM pass phrase: Verifying - Enter PEM pass phrase: -----
不要忘记密码!
以下步骤(1)(2)二选一 (这里使用(1))
接下来,可以使用以下命令将临时私钥转换为未加密的密钥:(1)
openssl rsa <tempkey.pem> server_key.pem
你将被提示输入密码, 并且看到如下结果:
Enter pass phrase:
writing RSA key
如果您希望使用密码对密钥进行加密,只需使用以下命令重命名临时密钥,而不要执行步骤(1):(2)
mv tempkey.pem server_key.pem
切记:如果您使用用密码加密的服务器密钥,则每次启动使用加密密钥的服务器应用程序时,都必须输入密码。这意味着,除非有人输入密钥,否则服务器应用程序将无法启动。
更改环境变量:
export OPENSSL_CONF=~/myCA/caconfig.cnf
使用证书颁发机构(CA)密钥对服务器证书进行签名:
openssl ca -in tempreq.pem -out server_crt.pem
系统将提示您输入CA的密码。输入此密码,将提示您确认exampleserver.cnf中的信息,最后要求确认签名证书。输出应与此类似:
Using configuration from /home/farsight/myCA/caconfig.cnf Enter pass phrase for /home/farsight/myCA/private/cakey.pem: Check that the request matches the signature Signature ok The Subject's Distinguished Name is as follows commonName :PRINTABLE:'localhost' stateOrProvinceName :PRINTABLE:'JS' countryName :PRINTABLE:'CN' emailAddress :IA5STRING:'root@tradeshowhell.com' organizationName :PRINTABLE:'My Organization Name' organizationalUnitName:PRINTABLE:'Subunit of My Large Organization' Certificate is to be certified until Dec 17 01:17:22 2025 GMT (1825 days) Sign the certificate? [y/n]:y 1 out of 1 certificate requests certified, commit? [y/n]y Write out database with 1 new entries Data Base Updated
使用以下命令删除临时证书和密钥文件:
rm -f tempkey.pem && rm -f tempreq.pem
恭喜你!您现在拥有一个自签名服务器应用程序证书和密钥对:
-
server_crt.pem:服务器应用程序证书文件
-
server_key.pem:服务器应用程序密钥文件
使用apache搭建HTTPS服务器
在 var/www 目录下创建目录 lab:
sudo cd && mkdir lab
在这个文件夹下创建index.html
sudo touch index.html #这个文件将作为网站的默认页面,你可以在里面随便写个html页面
编辑 /etc/apache2 目录 ports.conf 文件
Listen 80 后面加上 443 端口
修改后的文件如下:
# If you just change the port or add more ports here, you will likely also
# have to change the VirtualHost statement in
# /etc/apache2/sites-enabled/000-default
# This is also true if you have upgraded from before 2.2.9-3 (i.e. from
# Debian etch). See /usr/share/doc/apache2.2-common/NEWS.Debian.gz and
# README.Debian.gz
NameVirtualHost *:80
Listen 80 443
<IfModule mod_ssl.c>
# If you add NameVirtualHost *:443 here, you will also have to change
# the VirtualHost statement in /etc/apache2/sites-available/default-ssl
# to <VirtualHost *:443>
# Server Name Indication for SSL named virtual hosts is currently not
# supported by MSIE on Windows XP.
Listen 443
</IfModule>
<IfModule mod_gnutls.c>
Listen 443
</IfModule>
在 /etc/apache2/sites-available 目录下 创建 lab-ssl.conf 文件,写入并保存以下内容:
<IfModule mod_ssl.c>
<VirtualHost _default_:443>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/lab
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
# SSL Engine Switch:
# Enable/Disable SSL for this virtual host.
SSLEngine on
# 网站证书和私钥地址
SSLCertificateFile /home/<username>/myCA/server_crt.pem
SSLCertificateKeyFile /home/<username>/myCA/server_key.pem
<FilesMatch "\.(cgi|shtml|phtml|php)$">
SSLOptions +StdEnvVars
</FilesMatch>
<Directory /usr/lib/cgi-bin>
SSLOptions +StdEnvVars
</Directory>
</VirtualHost>
</IfModule>
注意:网站证书和私钥地址目录里<username> 要改成你自己的主机名
重启 apache2
sudo service apache2 restart
启动ssl服务:
sudo a2ensite /etc/apache2/sites-available/lab-ssl.conf
sudo a2enmod ssl
查看是否正确配置
在浏览器地址栏输入 https://localhost
浏览器不信任这个网站?这个网站的证书是自建CA签名的,浏览器并不信任这个CA,所以需要手动导入CA证书让浏览器信任我们的CA。

导入步骤如下:
打开 FireFox 浏览器,preference---advanced----certificates----view certificates----import,选择 myCA 目录下的根证书“cacert.pem”, 导入。
(不同版本浏览器可能操作步骤有些不同,请自行百度)
注:我这里修改了域名,不想改回去了,你应该看到页面地址栏是(https://localhost)
三、修改域名
将 /etc 目录下的 hosts 文件里加入一行 ip 到域名的映射
127.0.0.1 <你的域名>
127.0.0.1 localhost 127.0.0.1 <你的域名> 127.0.1.1 ubuntu # The following lines are desirable for IPv6 capable hosts ::1 ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters
将caconfig.cnf 文件 下面这一行DNS后面修改为你的域名
subjectAltName = DNS:<你的域名>
将exampleserver.cnf 文件 commonName修改为你的域名
ommonName = <你的域名>
按照上面 二、自建ca并搭建服务器 的方法重新搭建一遍

浙公网安备 33010602011771号