内网一键生成 LetsEncrypt HTTPS证书 - 3 - 生成证书

本文介绍了一种自动化部署SSL证书的方法,包括使用bash脚本生成RSA和ECC密钥、CSR文件,通过Python脚本申请Let's Encrypt证书,以及将证书打包并通过邮件发送。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 前提

ssl脚本执行目录:/root/ssl/
www目录: /root/www/challenges , python -m SimpleHTTPServer 80
sendemail放置地方:/root/ssl/sendemail

HTTP服务器准备

如果胆儿大,直接执行如下的内容即可

#!/bin/bash
# filepath: /root/ssl/a.sh

# 清场
ls | grep -v a.sh | grep -v sendemail | grep -v tar.gz | xargs -i rm -f {}

which openssl || (echo "没有找到openssl,开始安装"; yum install -y openssl)

# 创建一个目录
mkdir /root/ssl && echo "创建临时目录成功!" || (echo "创建临时目录失败";exit)

# 创建一个RSA私钥
openssl genrsa 4096 > account.key && echo "创建RSA私钥成功!" || (echo "创建RSA私钥失败!";exit)

# 创建另一个RSA私钥
openssl genrsa 4096 > domain.key && echo "创建另外一个私钥成功!" || (echo "创建另外一个RSA私钥失败!";exit)

#创建ECC私钥
openssl ecparam -genkey -name secp256r1 | openssl ec -out domain.key && echo "创建ECC私钥成功!" || (echo "创建ECC私钥失败!";exit)
openssl ecparam -genkey -name secp384r1 | openssl ec -out domain.key && echo "创建ECC私钥成功!" || (echo "创建ECC私钥失败!";exit)

#生成CSR文件,有两种方式,我用的是第二种,但是第一种可以一次多申请几个,可以稍后测试
# In how many days should certificates expire?
export KEY_EXPIRE=3650
export KEY_COUNTRY="CN"
export KEY_PROVINCE="SD"
export KEY_CITY="JN"
export KEY_ORG="IIOT"
export KEY_EMAIL="zzlyzq@gmail.com"
export KEY_OU="CloudPlatform"

#openssl req -new -sha256 -key domain.key -subj "/" -reqexts SAN -config <(cat /etc/ssl/openssl.cnf <(printf "[SAN]\nsubjectAltName=DNS:yoursite.com,DNS:www.yoursite.com")) > domain.csr
openssl req -new -sha256 -key domain.key -out domain.csr

# 配置验证服务,为啥要这么说呢,因为letsencrypt给的也是DV,也就是域名验证,我们运行软件申请的时候,本身python脚本会在本地写一个随机数到一个随机文件,它们官方会从远端经过公网DNS解析并去获取这个文件,如果一致,就说明这个站点是我们的,也就可以申请证书了。
[ -d "~/www/challenges" ] || mkdir -p ~/www/challenges/
# 另外,还需要两个步骤,最后会说明为啥要这两个步骤。
mkdir /root/www/challenges/.well-known/ -p
ln -s /root/www/challenges/ /root/www/challenges/.well-known/acme-challenge

# 接下来我们就要下载python脚本,并去申请证书了
wget https://raw.githubusercontent.com/diafygi/acme-tiny/master/acme_tiny.py

# 在执行下面之前,我们可以打开网站,最简单的就是使用python
#nohup python -m SimpleHTTPServer 80&
python acme_tiny.py --account-key ./account.key --csr ./domain.csr --acme-dir ~/www/challenges/ > ./signed.crt

# 如果一切正常,我们会看到signed.crt这个就是我们的证书了。

# 另外,我们还需要letsencrypt的中间证书,我也不知道啥意思,反正是需要一个官网的东西
wget -O - https://letsencrypt.org/certs/lets-encrypt-x3-cross-signed.pem > intermediate.pem
cat signed.crt intermediate.pem > chained.pem
wget -O - https://letsencrypt.org/certs/isrgrootx1.pem > root.pem
cat intermediate.pem root.pem > full_chained.pem

# 打包发送
tar czvf crt.tar.gz chained.pem domain.key
./sendemail -f 123@vip.126.com -t 123@iiot.ac.cn -s smtp.vip.126.com -u "证书快递" -xu 123 -xp 123 -m "证书For域名:XX生成成功" -a crt.tar.gz -o message-charset=utf-8

生成的时候会要求输入一些东西,比如国家,省会,城市,公司名称,common name最重要,这个就是域名哦。
生成完成后,会自动打包发送邮件。

<think>我们根据用户需求,需要为内网服务生成自签名SSL证书,并配置Nginx使用该证书提供HTTPS服务(端口9080)。 步骤分为两部分:生成自签名证书和配置Nginx。 第一部分:生成自签名证书 1. 创建证书存放目录(例如:/etc/nginx/ssl) 2. 生成私钥和自签名证书 第二部分:配置Nginx 1. 编辑Nginx配置文件,添加一个server块监听9080端口,并配置SSL证书路径 2. 配置代理转发到目标地址(https://fp.baiwang.com) 注意:自签名证书在浏览器中会显示不安全,需要手动信任(安装到本地受信任的根证书颁发机构)。 详细步骤: 一、生成自签名证书 1. 创建目录(如果不存在): sudo mkdir -p /etc/nginx/ssl 2. 生成私钥(server.key)和证书签名请求(CSR): 通常生成自签名证书可以直接一步生成私钥和证书,但也可以分开。这里我们一步生成: sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \ -keyout /etc/nginx/ssl/server.key \ -out /etc/nginx/ssl/server.crt 参数说明: - req: 创建证书签名请求 - x509: 生成自签名证书 - nodes: 不加密私钥(避免Nginx每次启动都要输入密码) - days 365: 证书有效期365天 - newkey rsa:2048: 生成一个新的2048位的RSA私钥 - keyout: 私钥输出路径 - out: 证书输出路径 执行命令后,会提示输入一些信息,如国家、省份、城市、组织名称、邮箱等。对于内网使用,这些信息可以自定义,但Common Name(域名)要填写内网访问的域名(如:internal.example.com)或IP地址。如果使用IP访问,则填写IP。但注意:浏览器对自签名证书使用IP会有额外警告。 3. 设置文件权限(可选,确保私钥安全): sudo chmod 400 /etc/nginx/ssl/server.key 二、配置Nginx 1. 在Nginx配置文件中(例如:/etc/nginx/nginx.conf 或 /etc/nginx/conf.d/default.conf)添加以下配置: server { listen 9080 ssl; server_name 内网域名或IP; # 例如:192.168.1.100 或 internal.example.com ssl_certificate /etc/nginx/ssl/server.crt; ssl_certificate_key /etc/nginx/ssl/server.key; # SSL优化配置 ssl_session_cache shared:SSL:1m; ssl_session_timeout 5m; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384; ssl_prefer_server_ciphers on; location / { proxy_pass https://fp.baiwang.com; # 设置必要的头信息 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; # 解决目标服务器SSL证书验证问题(如果是自签名或测试环境,可以关闭验证) proxy_ssl_verify off; proxy_ssl_server_name on; } } 2. 测试配置并重载Nginx: sudo nginx -t sudo nginx -s reload 三、客户端信任自签名证书(可选) 由于是自签名证书,浏览器访问时会提示不安全。如果需要让浏览器信任,可以将生成的server.crt证书文件导入到客户端的受信任根证书颁发机构。 对于Windows: - 双击server.crt文件,选择“安装证书->“本地计算机”->“将所有的证书都放入下列存储”->“受信任的根证书颁发机构” 对于Mac: -证书文件拖入“钥匙串访问”应用,然后找到该证书,右键选择“信任”->“始终信任” 注意:内网使用,建议为每个客户端安装此证书。 四、访问测试 使用浏览器访问:https://内网域名或IP:9080 如果配置正确,应该能访问到fp.baiwang.com的内容。 相关问题: 1. 如何为内网多个域名生成自签名证书? 2. Nginx配置HTTPS代理时出现502错误如何排查? 3. 如何让Nginx同时支持HTTP和HTTPS代理? 4. 自签名证书的有效期过后如何更新? 5. 如何配置Nginx以支持客户端证书验证(双向SSL)?</think>### 为 Nginx 内网服务配置自签名 SSL 证书 #### 步骤 1:生成自签名证书 ```bash # 创建证书目录 sudo mkdir -p /etc/nginx/ssl cd /etc/nginx/ssl # 生成私钥和证书(有效期365天) sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \ -keyout server.key \ -out server.crt # 设置文件权限 sudo chmod 400 server.key ``` 执行命令时需要填写以下信息(示例): ``` Country Name (2 letter code) [XX]:CN State or Province Name (full name) []:Beijing Locality Name (eg, city) [Default City]:Beijing Organization Name (eg, company) [Default Company Ltd]:MyCompany Organizational Unit Name (eg, section) []:IT Common Name (eg, your name or server&#39;s hostname) []:internal.example.com # 内网域名或IP Email Address []:admin@example.com ``` #### 步骤 2:Nginx 配置(/etc/nginx/conf.d/internal.conf) ```nginx server { listen 9080 ssl; server_name internal.example.com; # 替换为内网域名或IP # 证书路径配置 ssl_certificate /etc/nginx/ssl/server.crt; ssl_certificate_key /etc/nginx/ssl/server.key; # SSL 优化参数 ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256; ssl_prefer_server_ciphers on; # 代理设置 location / { proxy_pass https://fp.baiwang.com; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto https; # 目标服务器SSL设置 proxy_ssl_server_name on; proxy_ssl_verify off; # 测试时可关闭验证 } # 错误日志 error_log /var/log/nginx/internal_error.log; access_log /var/log/nginx/internal_access.log; } ``` #### 步骤 3:应用配置 ```bash # 测试配置语法 sudo nginx -t # 重载配置 sudo nginx -s reload ``` #### 步骤 4:客户端信任证书(以 Windows 为例) 1. 将 `server.crt` 复制到客户端 2. 双击证书文件 → 安装证书 → 本地计算机 3. 选择 "将所有证书放入下列存储" → 浏览 → 选择 "受信任的根证书颁发机构" 4. 完成导入 #### 验证方法 ```bash curl -k -v https://internal.example.com:9080 ``` 应看到 `fp.baiwang.com` 的响应内容 ### 关键配置说明 1. **证书参数**: - `-nodes` 参数避免私钥加密(否则 Nginx 每次启动需输密码) - `rsa:2048` 提供足够的安全强度[^1] - 内网域名(Common Name)必须与访问地址一致 2. **SSL 优化**: - `ssl_session_cache` 减少 SSL 握手开销 - `TLSv1.2/1.3` 禁用不安全的老旧协议[^3] - 优先使用 ECDHE 密钥交换算法(前向保密) 3. **代理注意事项**: - `proxy_ssl_server_name on` 传递 SNI 信息[^2] - `X-Forwarded-Proto` 标记原始协议为 HTTPS - 生产环境应启用 `proxy_ssl_verify` 并配置 CA 证书 ### 相关问题 1. 如何为多个内网域名生成 SAN(主题备用名称)证书? 2. Nginx 代理 HTTPS 服务时出现 502 错误如何排查? 3. 如何配置客户端证书验证实现双向 SSL 认证? 4. 自签名证书过期后如何无缝更新不影响服务? 5. 如何通过 Let&#39;s Encrypt内网服务申请免费证书? > 配置要点:自签名证书中的 `.crt` 文件包含公钥信息,`.key` 是必须保密的私钥文件[^3]。对于内网使用,建议将证书有效期设置为 5-10 年(`-days 3650`),并通过组策略将证书批量部署到所有客户端。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值