由于开发过程中经常遇到使用https进行测试的一个环境,而如果想要一个权威认证的ssl证书又不便宜,而且需要自己拥有域名和服务器、DNS认证等等,如果只是单纯的想要一个https环境作为测试,那么自己生成一个证书就够了,虽然浏览器会有警告,但这不重要,直接点击相信即可。
由CA签署的证书为服务器提供重要的功能:
浏览器会自动识别证书并且在不提示用户的情况下允许创建一个安全连接。
当一个CA生成一个签署过的证书,它为提供网页给浏览器的组织提供身份担保。
多数支持ssl的web服务器都有一个CA列表,它们的证书会被自动接受。当一个浏览器遇到一个其授权CA并不在列表中的证书,浏览器将询问用户是否接受或拒绝连接。
环境
由于我们生成的证书需要用到openssl及nginx,请提前准备好。
开始
①建立目录certs,专门用来存放证书和私钥
mkdir certs
1
下图是我们最后完成的时候在这个目录下产生的文件
②创建配置文件用于生成证书
vim localhost.conf
配置文件内容如下,可自作修改
[ req ]
default_bits = 2048 # RSA的2048是公认较比较安全的key长度
default_keyfile = server-key.pem
distinguished_name = subject
req_extensions = req_ext
x509_extensions = x509_ext
string_mask = utf8only
[ subject ]
countryName = Country Name (2 letter code)
countryName_default = US
stateOrProvinceName = State or Province Name (full name)
stateOrProvinceName_default = NY
localityName = Locality Name (eg, city)
localityName_default = New York
organizationName = Organization Name (eg, company)
organizationName_default = Example, LLC
commonName = Common Name (e.g. server FQDN or YOUR name)
commonName_default = Example Company
emailAddress = Email Address
emailAddress_default = test@example.com
[ x509_ext ]
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid,issuer
basicConstraints = CA:FALSE
keyUsage = digitalSignature, keyEncipherment
subjectAltName = @alternate_names
nsComment = "OpenSSL Generated Certificate"
[ req_ext ]
subjectKeyIdentifier = hash
basicConstraints = CA:FALSE
keyUsage = digitalSignature, keyEncipherment
subjectAltName = @alternate_names
nsComment = "OpenSSL Generated Certificate"
[ alternate_names ]
DNS.1 = 192.168.XXX.XXX # 注意这里一般改为自己本地的ip或者域名
③生成SSL证书
创建自签名密钥和证书对
openssl req -config localhost.conf -new -sha256 -newkey rsa:2048 -nodes -keyout localhost.key -x509 -days 365 -out localhost.crt
openssl:这是用于创建和管理OpenSSL证书,密钥和其他文件的基本命令行工具。
req:此子命令指定我们要使用X.509证书签名请求(CSR)管理。“X.509”是SSL和TLS为其密钥和证书管理所遵循的公钥基础结构标准。我们想要创建一个新的X.509证书,所以我们使用这个子命令。
-x509:通过告诉实用程序我们要创建自签名证书而不是生成证书签名请求(通常会发生)来进一步修改上一个子命令。
-nodes:这告诉OpenSSL跳过用密码保护我们的证书的选项。当服务器启动时,我们需要Nginx能够在没有用户干预的情况下读取文件。密码短语会阻止这种情况发生,因为我们必须在每次重启后输入密码。
-days 365:此选项设置证书被视为有效的时间长度。我们在这里设置了一年。
-newkey rsa:2048:这指定我们要同时生成新证书和新密钥。我们没有创建在上一步中签署证书所需的密钥,因此我们需要将其与证书一起创建。该rsa:2048部分告诉它制作一个2048位长的RSA密钥。
-keyout:这一行告诉OpenSSL在哪里放置我们正在创建的生成的私钥文件。
-out:这告诉OpenSSL在哪里放置我们正在创建的证书。
然后这个目录下就会多了两个文件localhost.crt和localhost.key
localhost.crt
localhost.crt,这就是生成的自签名证书(CRT 用于向CA请求证书的文件)
# localhost.crt
-----BEGIN CERTIFICATE-----
fdasfefFEQfJHJKJASCJLJIAJIj
...
-----END CERTIFICATE-----
localhost.key
localhost.key,CA私钥文件
# localhost.key
-----BEGIN PRIVATE KEY-----
VElSjtw86nTFKnOJhe2B9lk=
...
-----END PRIVATE KEY-----
④配置nginx
为了能使用我们刚刚生成的ssl证书用于nginx配置,那么就需要将刚刚生成的localhost.crt和localhost.key拷贝一份到nginx的ssl目录下
# 比如:我的nginx的目录是/etc/nginx
cd /etc/nginx/ssl
由于是自签的证书,所以最好是在nginx下的conf.d目录单独创建一个配置文件用于做自签证书的环境配置,不过如果要让conf.d下的文件能生效,就需要在nginx.conf有这么一句话
进入到conf.d下,创建一个配置文件localhost.conf
vim localhost.conf
配置文件内容如下
server {
listen 80;
listen 443 ssl http2;
server_name 192.168.XXX.XXX; # 具体内容根据自身情况进行修改
ssl_certificate /etc/nginx/ssl/localhost.crt;
ssl_certificate_key /etc/nginx/ssl/localhost.key;
location / {
proxy_pass http://192.168.XXX.XXX:50000; # 具体内容根据自身情况进行修改,端口根据自身情况进行修改
}
}
⑤nginx重新加载配置
nginx -s reload
⑥打开Web浏览器,然后在地址栏输入 https:// 及服务器的域名或IP
https://192.168.XXX.XXX
由于我们创建的证书未由您的某个浏览器的受信任证书颁发机构签名,所以会有不信任的警报跳出,但不重要,不影响我们进行一个测试