自動獲取 Let's Encrypt?免費證書
(適用于 Linux 系統)?
安裝 Certbot
sudo apt-get update
sudo apt-get install certbot python3-certbot-nginx ?# Nginx 服務器
sudo apt-get install certbot python3-certbot-apache ?# Apache 服務器獲取和安裝證書
sudo certbot --nginx
sudo certbot --apache
admin@debian.com
Y 同意協議
Y 同意分享電子郵件
1,2,3,4 多個域名一起
配置自動更新
Let's Encrypt 證書的有效期為 90 天。為了保持證書的有效性,建議設置自動更新任務。Certbot 默認會創建一個 cron 任務來自動更新證書。
可以通過以下命令手動測試自動更新任務
sudo certbot renew --dry-run
手動獲取 Let's Encrypt 免費證書(通用方法)
安裝 Certbot
sudo apt-get update
sudo apt-get install certbot
sudo certbot certonly --standalone -d yourdomain.com配置證書
獲取證書后,將證書和私鑰配置到你的服務器軟件(如 Nginx 或 Apache)中。通常,Certbot 會將證書和私鑰存放在 /etc/letsencrypt/live/yourdomain.com/ 目錄下。自動更新
設置自動更新任務以保持證書的有效性。可以通過 cron 任務來定期執行 Certbot 的更新命令:
sudo crontab -e
0 0 * * * certbot renew --quiet
以上為每天午夜執行證書的自動更新檢查配置 Nginx 或 Apaceh
自建證書
vhost.ext??域名證書附加配置信息
create_cert.sh?創建證書到 ca(中間證書 )?以及 certs?兩個目錄下
CA.bat?導入證書到 windows?里的?受信任的根證書頒發機構,?也可手動?certmgr.msc?添加
vhost.ext
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names[alt_names]
DNS.1 = localhost
IP.2 = 127.0.0.1
IP.3 = 192.168.1.90
DNS.4 = *.yiparts.debian
DNS.5 = admin.yiparts.debian
DNS.6 = world.yiparts.debian
IP.2 = 192.168.1.90 ? ? ? ?
表示https要訪問的ip,IP.3也是ip,ssl證書說明可以自簽多個ip,這是自簽ip的證書
DNS.4 = demo.yiparts.debian
表示https要訪問的域名,DNS.5,DNS.6都一樣是域名,ssl證書說明可以自簽多個域名,這是自簽域名的證書
?create_cert.sh
執行?sudo ./create_cert.sh demo.yiparts.debian
#create_cert.sh
#!/bin/bashsudo mkdir -p ca
sudo mkdir -p certs# 設置域名變量
# 接收參數
# 第一個參數是域名, 例 sudo ./create_cert.sh demo.yiparts.debian
DOMAIN="$1"
# 檢查是否傳遞了參數
if [ -z "$DOMAIN" ]; thenecho "請輸入一個域名: $0 <domain>"exit 1
fi
# 提取基礎域名部分
if [[ "$DOMAIN" == *"*."* ]]; thenecho "自簽證書泛域名會被瀏覽器提示不安全"exit 1
fi# 證書文件名
GUID=$DOMAIN
CA="CA-$GUID"
EMAIL="admin@qg.com"# 去 CA 目錄
cd ca# 生成 CA 私鑰 需要設置密碼否則會被瀏覽器提示不安全
sudo openssl genrsa -des3 -out "$CA.key" 2048# 生成 CA 證書 100年
sudo openssl req -x509 -new -nodes -key "$CA.key" -sha256 -days 36500 -out "$CA.crt" -subj "/CN=$DOMAIN/O=Qg Inc/OU=It/L=Guang Zhou/ST=Guang Dong/C=CN/emailAddress=$EMAIL"# 去 CERTS 目錄
cd ..
cd certs# 生成 SSL 私鑰
sudo openssl genrsa -out "$GUID.key" 2048# 生成 SSL 證書請求(CSR)
sudo openssl req -new -key "$GUID.key" -out "$GUID.csr" -subj "/CN=$DOMAIN/O=Qg Inc/OU=It/L=Guang Zhou/ST=Guang Dong/C=CN/emailAddress=$EMAIL"# 使用 CA 證書簽署 SSL 證書,有效期 100 年
sudo openssl x509 -req -in "$GUID.csr" -out "$GUID.crt" -days 36500 -CA "../ca/$CA.crt" -CAkey "../ca/$CA.key" -CAcreateserial -extfile "../vhost.ext"# 查看簽署的證書信息
sudo openssl x509 -in "$GUID.crt" -noout -text# 驗證 SSL 證書
sudo openssl verify -CAfile "../ca/$CA.crt" "$GUID.crt"echo "所有操作已完成。"
CA.bat??
@echo offchcp 65001 > nulfor %%f in (CA\*.crt) do (echo 導入 %%f 證書C:\Windows\System32\certutil -store Root | findstr /C:"%%~nf" > nulif errorlevel 1 (C:\Windows\System32\certutil -addstore -f "Root" "%%f") else (echo 證書 %%f 已經導入,跳過)
)
echo
echo 證書已成功導入到受信任的根證書頒發機構
pause
Nginx?配置
server {listen 443 ssl;ssl_certificate /home/qg/ssl/certs/demo.yiparts.debian.crt; ssl_certificate_key /home/qg/ssl/certs/demo.yiparts.debian.key; ssl_session_timeout 5m;ssl_session_cache shared:SSL:50m;ssl_protocols SSLv3 SSLv2 TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP; server_name demo.yiparts.debian;root /home/wwwroot/project/yiparts; #網站根目錄index index.php index.html index.htm;# Message Websocket 的 SSL 代理服務# php messageWorker.php -d start 守護進程方式啟動 Websocket, 其它 start,restart,stop, ps -aux | grep messageWoker# 測試 https://demo.yiparts.debian/wss 是否正常# 使用域名連接 wss://demo.yiparts.debian/wss# 如果還是連接失敗, 檢查域名白名單 cfg('websocket>whiteList')location /wss{proxy_pass http://127.0.0.1:8181; # swoole 或 workerman 提供的 Websocket 監聽地址:端口proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "Upgrade";proxy_set_header X-Real-IP $remote_addr; # 透傳真實客戶端ip, $_SERVER['HTTP_X_REAL_IP']}# 靜態文件location ~ ^/(static|files|cache)/ {try_files $uri =404; # /xxx/開頭的網址直接尋找對應的文件輸出,不管文件是否存在}# 這些放入上面的 /xxx/目錄下#location ~* \.(htm|js|ts|css|jpg|jpeg|png|gif|ico|svg)$ {# #ttf|eot|woff|woff2|zip|gz|pdf|xml|txt|tiff|xls|xlsx|doc|docx|ppt|pptx|cad|mp3|mp4 # try_files $uri =404; # 以 .xxx 結尾的直接尋找對應的文件輸出,不管文件是否存在#}# XMVC 入口文件 index.phplocation / {try_files $uri $uri/ /index.php?$query_string; # 除前面的直接輸出規則外所有的請求交給 index.php}# PHP 代理fastcgi_read_timeout 600s; # 開發環境下增加 FastCGI 超時時間, 用于 xdebug 調試用location ~ \.php$ {include snippets/fastcgi-php.conf;fastcgi_pass unix:/run/php/php8.2-fpm.sock;fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;include fastcgi_params;# 開發環境下 禁用 OPcachefastcgi_param PHP_ADMIN_VALUE "opcache.enable=0";# 開發環境下 添加開發者頭信息fastcgi_param X_DEVELOP "1";}
}