一、生成私钥

第一步生成一个私钥,私钥的生成需要确定几个基本参数。

  • 密钥算法

    • OpenSSL支持DSA、RSA、ECDSA三种。
    • DSA最大长度为1024位是不安全的。不会在TLS实际应用中采用DSA。
    • RSA是几乎所有TLS实际应用中采取的加密算法。
    • ECDSA在同等加密强度上比RSA快2-6倍。但是只有较新的浏览器支持,在未来将会成为主流。
  • 密钥长度

    • RSA的默认长度为512位是不安全的,一般会使用2048位长度。
    • ECDSA的密钥应该设定为256位以上。
  • 密码

    • 受到密码保护的密钥可以安全的存储、传输、备份。
    • 使用密码,会导致在重启Web服务器时会提示输入密码,这会造成极大的不便,生产环境中不会使用。若想在生产环境中确保密钥安全,需要使用HSM硬件解决方案。
    • HSM(硬件安全模块)设计为即便能够物理访问它,也无法导出密钥。HSM的价格昂贵,仅使用于对安全有极高需求的情况。

生成RSA密钥:

$ openssl genrsa -aes128 -out <密钥名称>.key 2048
#命令执行后,进入交互方式设置密钥的密码。
-genrsa 生成RSA私钥
-aes128 私钥加密保存算法
-out 输出密钥为文件
-2048 RSA密钥的长度

#生成的私钥以纯文本的PEM格式存储。

生成ECDSA密钥:

$ openssl ecparam -genkey -name secp256r1 | openssl ec -out <密钥名称>.key -aes128
#ECDSA密钥的创建,需要先选择一个命名曲线(named curve),由它来控制密钥长度。
-name secp256r1 选择了“secp256r1”这个命名曲线创建一个256位长度的ECDSA密钥。
#OpenSSL支持大量命名曲线,而作为Web服务器使用,受到大多数览器支持的只有:“secp256r1”和"secp384r1"。

二、创建证书签名申请

一旦有了私钥,就可以创建证书签名申请(certificate signing request,CSR)。这是要求CA给证书签名的一种正式申请,该申请包含申请证书的实体的公钥以及该实体的某些信息。该数据将成为证书的一部分。CSR始终使用它携带的公钥所对应的私钥进行签名。
CSR创建的过程一般都是交互式的,你需要提供区分证书所需的不同元素。如果你想让某一个字段为空,不要直接回车,必须输入一个点(.)。

创建CSR证书签名申请:

$ openssl req -new -key <私钥名称>.key -out <签名申请名称>.csr
#依次提示输入国家、地区,城市,组织,组织单位、Common Name、电子邮箱地址。
#Common Name为网站的域名。

非交互方式生成CSR:

创建一个.cnf配置文件,格式如下

[req]
prompt = no
distinguished_name = dn
req_extensions = ext
input_password = <密码>
[dn]
CN = www.abc.com <域名>
emailAddress = master@abc.com <邮箱>
O = Feisty Duck Ltd
L = London
C = GB
[ext]
subjectAltName = DNS:www.abc.com,DNS:abc.com

使用-config指定配置文件,进行CSR创建:

$ openssl req -new -config <配置文件> -key <私钥名称>.key -out <签名申请名称>.csr

三、自签名证书

如果你只是想安装一台自己使用的TLS服务器,那么可以不必找CA去获取一个公开信任的证书,自己就可以直接签发一个。最简单的方式就是生成自签名证书。

已有CSR的情况:

$ openssl x509 -req -days 365 -in <签名申请名称>.csr -sginkey <私钥名称>.key -out <证书名称>.crt

直接使用私钥创建自签名证书

$ openssl x509 -req -days 365 -key <私钥名称>.key -out <证书名称>.crt

#如果不要交互式提示,使用-subj并带上信息:
$ openssl x509 -req -days 365 -key <私钥名称>.key -out <证书名称>.crt \
-subj "/C-BG/L-London/O-Feisty Duck Ltd/CN-www.abc.com"

创建多域名证书

<扩展信息>.ext
subjectAltName = DNS:*.abc.com, DNS:abc.com
#创建一个.ext的扩展信息配置文件,并在接下来的步骤中引用。

openssl x509 -req -day 365 \
-in <签名申请名称>.csr -sginkey <私钥名称>.key -out <证书名称>.crt \
-extfile <扩展信息>.ext
#使用x509命令签发证书时,使用-extfile引用扩展信息配置文件。

四、密钥和证书格式转换

PEM格式和DER之间转换:

$ openssl x509 -infrom PEM -in <证书名称>.pem -outform DER -out <证书名称>.der
#PEM转换为der
$ openssl x509 -infrom DER -in <证书名称>.der -outform PEM -out <证书名称>.pem
#der转换为pem

五、在Nginx中配置SSL

安装Nginx的http_ssl_module模块

./configure --prefix=/usr/local/nginx --with-http_ssl_module
#编译安装nginx时,需要使用--with-http_ssl_module参数。

存放证书文件

mkdir /usr/local/nginx/conf/cert
在Nginx的conf目录内建立cert目录,用于存放证书文件,同时方便在Nginx配置文件中,使用相对地址进行证书读取。

修改Nginx主机配置文件

server {
listen 443 ssl;   #SSL协议访问端口号为443。此处如未添加ssl,可能会造成Nginx无法启动。
server_name ywngo.com;  #将localhost修改为您证书绑定的域名,例如:www.example.com。
root html;
index index.php index.html index.htm;
ssl_certificate cert/domain name.pem;   #将domain name.pem替换成您证书的文件名。
ssl_certificate_key cert/domain name.key;   #将domain name.key替换成您证书的密钥文件名。
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;  #使用此加密套件。
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;#使用该协议进行配置。
ssl_prefer_server_ciphers on;
location / {
root html;#站点目录。
index index.php index.html index.htm;
}
}

设置HTTP请求自动跳转HTTPS

server {
 listen 80;
 server_name localhost;   #将localhost修改为您证书绑定的域名,例如:www.example.com。
rewrite ^(.*)$ https://$host$1 permanent;   #将所有http请求通过rewrite重定向到https。
 location / {
index index.html index.htm;
}
}

完成后重启Nginx,并访问网站进行测试。

标签: none

添加新评论