1. 安装openssl
确定openssl版本:
$openssl version
若未安装:
$sudo apt-get install openssl
2. 创建初始工作环境
目录准备:
cd && mkdir -p myCA/signedcerts && mkdir myCA/private && cd myCA
创建并进入myCA,同时生成两个子目录 signedcerts和private
myCA用于存放CA根证书,证书数据库,以及后续服务器生成的证书,密钥以及请求
signedcerts:保存签名证书的copy
private: 包含私钥
3. 在myCA中配置参数文件:
echo '01'>serial && touch index.txt
然后创建caconfig.cnf文件:
vi ~/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/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 = md5
#
policy = local_ca_policy
x509_extensions = local_ca_extensions
#
#
# Default policy to use when generating
# server certificates. The following
# fields must be defined in the server
# certificate.
#
[ 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 ]
subjectAltName = DNS:alt.tradeshowhell.com
basicConstraints = CA:false
nsCertType = server
#
#
# The default root certificate
# generation policy.
#
[ req ]
default_bits = 2048
default_keyfile = /home/myCA/private/cakey.pem 注意自己的文件地址
default_md = md5
#
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 = CH
emailAddress = root@tradeshowhell.com
organizationName = Trade Show Hell
#
[ root_ca_extensions ]
basicConstraints = CA:true
注:保存并退出编译模式按Esc键后 输入:wq(:也是需要输入的)
4. 生成CA 根证书和密钥。
export OPENSSL_CONF=~/myCA/caconfig.cnf
该命令用于给环境变量OPENSSL_CONF赋值为caconfig.cnf。
然后,生成CA根证书和密钥
openssl req -x509 -newkey rsa:2048 -out cacert.pem -outform PEM -days 1825
可能会出现一下问题:
这是因为有的版本不会自动创建cecert.pem和cakey.pem文件
需要创建文件
创建cecert.pem文件
touch cacert.pem # 文件举例
设置密钥
openssl genrsa -out cakey.pem 2048
进入/myCA/private
cd ./private/
再创建cakey.pem文件
touch cakey.pem # 文件举例
设置密钥
openssl genrsa -aes256 -out cakey.pem 2048
此步骤需要设置密码
返回上一个目录:
cd ..
重复4步骤 出现以下需要设置密码页面
之后设置密码,不要忘记。
以上步骤生成了CA自签名根证书,和RSA公/私密钥对。证书的格式是PEM,有效期是1825天。
/myCA/cacert.pem: CA根证书
/myCA/private/cakey.pem:CA私钥
5. 创建服务器公私钥,并让CA签名,生成服务器证书。
生成服务器配置文件~/myCA/exampleserver.cnf,例子如下:
#
# server.cnf
#
[ req ]
prompt = no
distinguished_name = server_distinguished_name
[ server_distinguished_name ]
commonName = localhost # 服务器域名,由于在本地测试,设为 localhost 即可
stateOrProvinceName = JS # 服务器所在省份
countryName = CN # 服务器所在国家(仅限2字符)
emailAddress = example@qq.com # 邮箱
organizationName = USTC # 组织名
organizationalUnitName = SE # 单位名
注:保存并退出编译模式按Esc键后 输入:wq(:也是需要输入的)清空内容为:%d 回车执行
配置文件准备好之后,使用如下命令生成服务器证书:
export OPENSSL_CONF=~/myCA/exampleserver.cnf
该命令设置环境变量OPENSSL_CONF,使得openssl更换配置文件。
然后生成证书和密钥:
openssl req -newkey rsa:1024 -keyout tempkey.pem -keyform PEM -out tempreq.pem -outform PEM
同样的,需要输入密码短语。
然后,需要将临时私钥转换为unencrypted key。命令如下:
openssl rsa < tempkey.pem > server_key.pem
需要输入密码短语。
如果希望将key保持为加密状态,直接改名,
mv tempkey.pem server_key.pem
现在,需要使用CA key对服务器证书签名:
export OPENSSL_CONF=~/myCA/caconfig.cnf
openssl ca -in tempreq.pem -out server_crt.pem
出现该页面
删除临时证书和密码文件。
rm -f tempkey.pem && rm -f tempreq.pem
现在,自签名的服务器证书和密钥对便产生了:
1. server_crt.pem : 服务器证书文件
2. server_key.pem : 服务器密钥文件
二,
以 apache 为例来配置 https 服务,首先安装 apache:
sudo apt install apache2
apache 默认是 http 访问的,我们需要配置它的 https 服务并启用,首先 cd 到 apache 的可用站点目录:
cd /etc/apache2/sites-available/
其中有一个默认的 ssl 站点 default-ssl.conf,我们不用新建站点,修改它里面的 ssl 配置并启用即可,修改这个文件需要 sudo 权限
sudo vi default-ssl.conf
打开后找到其中的证书和私钥设置,修改为自己的服务器证书和私钥文件位置:
SSLCertificateFile /home/{username}/https/server/server_crt.pem
SSLCertificateKeyFile /home/{username}/https/server/server_key.pem
然后重启 apache 服务器:
# 启用默认 ssl 站点和 ssl 模块
a2ensite default-ssl.conf
a2enmod ssl