Skip to content

Windows 使用 openssl 自签名 nginx https 证书

Windows 安装 openssl

openssl 官网 https://slproweb.com/products/Win32OpenSSL.html

也可以直接点击下载安装包 https://slproweb.com/download/Win64OpenSSL_Light-3_3_0.exe

1. 打开命令提示符或 PowerShell

在 Windows 上,你可以通过在开始菜单搜索“cmd”或“PowerShell”来打开命令提示符或 PowerShell 窗口。

powershell
PS C:\Users\Administrator\Desktop> openssl -v
OpenSSL 3.2.0 23 Nov 2023 (Library: OpenSSL 3.2.0 23 Nov 2023)

2. 创建私钥和证书签名请求(CSR)

首先,你需要创建一个私钥和证书签名请求(CSR)。CSR 是向证书颁发机构(CA)申请证书时使用的。

bash
openssl req -new -newkey rsa:2048 -nodes -keyout yourdomain.key -out yourdomain.csr

yourdomain替换为你的实际域名或者你希望使用的名称。这一步骤会询问一系列问题,如组织名称和常用名称(你的完整域名),请根据实际情况填写。

PS
............+++++++++++++++++++++++++++++++++++++++*+...+...+.....+.
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:CN
State or Province Name (full name) [Some-State]:Beijing
Locality Name (eg, city) []:Beijing
Organization Name (eg, company) [Internet Widgits Pty Ltd]:李钟意
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:localhost
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
PS C:\Users\Administrator\Documents\vite-docs\src\nginx>
  • Country Name (2 letter code) [AU]: 如果你在中国,对于“Country Name (2 letter code)”这一项,你应该输入 CN。这是中国的两个字母的国家代码。在 OpenSSL 生成证书的过程中,这将表示证书所代表的组织或个人位于中国。

  • State or Province Name (full name) [Some-State]: 在“State or Province Name (full name)”这一项中,你应该输入你所在的省份或直辖市的全名,例如“Beijing”(北京)、“Shanghai”(上海)、“Guangdong”(广东)等。如果你位于一个具体的省份,就输入那个省份的名称。这一信息用于进一步指定证书请求者的地理位置。

  • Locality Name (eg, city) []: 在“Locality Name (eg, city)”这一项中,你应该输入你所在的城市的名称,比如“Beijing”(如果你在北京)。这一信息用于进一步指定证书请求者的地理位置。如果你位于其他城市,例如上海或广州,你应该输入相应的城市名称(例如“Shanghai”或“Guangzhou”)。这有助于标识证书使用者的具体位置。

  • Organization Name (eg, company) [Internet Widgits Pty Ltd]: 在“Organizational Unit Name (eg, section)”这一项中,你可以输入你所在组织内的具体部门或者单位名称。比如说,如果你在一个大公司工作,这里可以填写“IT 部门”、“财务部”或者“人力资源部”等。如果你是为个人项目创建证书,或者你的组织结构比较简单,这里也可以留空或者填写一个与你项目相关的描述,例如“个人项目”或者简单描述你的职责或项目特点,如“网站安全”、“开发团队”。这个字段不是必填的,如果你不确定填什么,留空或输入一个点(.)即可。

  • Common Name (e.g. server FQDN or YOUR name) []: 在“Common Name (e.g. server FQDN or YOUR name)”这一项中,你应该输入服务器的完全限定域名(FQDN)或者如果是为个人使用,可以是你的名字。对于服务器证书,这通常是人们在浏览器中输入以访问你的网站的地址,例如“www.example.com”。

    如果你是在创建一个用于 HTTPS 服务器的证书,确保这里的名字与你希望用户通过 HTTPS 访问的域名完全一致。如果你的网站支持多个子域名,你可能需要使用通配符,如“*.example.com”来覆盖所有子域名。

    如果这个证书是为了其他用途,比如用于客户端身份验证,那么你可以输入一个代表用户或设备的标识,如用户的邮箱地址或设备的序列号。

    如果是 localhost 访问呢

    如果证书是为了在本地测试或开发环境中使用,以便通过 HTTPS 访问本地服务器(比如在进行网站开发时),并且你打算通过localhost这个特殊的主机名来访问,那么在“Common Name (e.g. server FQDN or YOUR name)”这一项中,你应该输入localhost

    这样,当你在本地机器上通过浏览器访问https://localhost时,浏览器会将这个自签名证书视为有效(尽管它会警告证书不是由受信任的证书颁发机构签发的)。这对于本地开发和测试非常有用,因为它允许你在一个安全的环境中工作,模拟生产环境中的 HTTPS 设置。

  • Email Address []:

    对于“Email Address []:”这一项,你应该输入你的电子邮件地址。这个信息有时用于证书的联系信息部分,尽管在自签名证书的情况下,它的实际用途可能不大。如果你不希望提供电子邮件地址或认为不需要,可以留空或输入一个点(.)以跳过。

  • A challenge password []:

    接下来,“A challenge password []:”是一个可选项,用于在未来对证书请求进行额外的验证。这个密码可以保护证书签名请求(CSR)不被未经授权的用户篡改。在大多数情况下,对于自签名证书而言,这个选项不是必需的,特别是在测试或开发环境中。如果你选择不设置挑战密码,可以直接留空并继续。设置挑战密码主要是在企业环境中,当证书请求需要发送给外部的证书颁发机构(CA)进行签名时,用来增加安全性。对于自签名证书,通常可以跳过这一步。

3. 创建自签名证书

有了私钥和 CSR 之后,你就可以创建自签名的证书了。这可以通过以下命令完成:

powershell
openssl x509 -req -days 365 -in yourdomain.csr -signkey yourdomain.key -out yourdomain.crt
bash
openssl x509 -req -days 365 -in localhost.csr -signkey localhost.key -out localhost.crt

这会创建一个有效期为 365 天的自签名证书。你可以根据需要调整-days参数来改变证书的有效期。

powershell
PS C:\Users\Administrator\Desktop\nginx-course\nginx-https> openssl x509 -req -days 365 -in localhost.csr -signkey localhost.key -out localhost.crt
Certificate request self-signature ok
subject=C=CN, ST=Beijing, L=Beijing, O=lizhongyi, OU=it, CN=localhost
PS C:\Users\Administrator\Desktop\nginx-course\nginx-https> ls


    目录: C:\Users\Administrator\Desktop\nginx-course\nginx-https


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----         2024/4/30      3:02           1290 localhost.crt
-a----         2024/4/30      3:00           1018 localhost.csr
-a----         2024/4/30      2:59           1732 localhost.key

4. 配置 Nginx 使用 SSL 证书

一旦你拥有了.crt 和.key 文件,你就需要配置 Nginx 以使用这些文件为 HTTPS 提供服务。

打开你的 Nginx 配置文件(通常位于/etc/nginx/sites-available/yourdomain),并添加以下内容到 server 块中:

powershell
docker run --rm -it --name https-nginx -p 8088:80 nginx
  • docker run: 这个命令用于启动一个新的容器。
  • --rm: 这个选项告诉 Docker 在容器退出时自动删除容器。这意味着一旦容器停止运行,它的所有数据都将被永久删除,但容器所使用的镜像不会被删除。
  • -it: 这实际上是两个选项的组合:
    • -i (interactive): 交互模式,让容器的标准输入保持打开状态,即使没有连接。
    • -t (tty): 分配一个伪终端,即命令行界面,用于交互式操作。
  • --name https-nginx: 这个选项为容器指定了一个名称,这里命名为 https-nginx。如果没有指定这个选项,Docker 会随机生成一个名称。
  • -p 8088:80: 这个选项将宿主机的端口映射到容器的端口。这里,它将宿主机的端口 8088 映射到容器的端口 80。这意味着如果您在宿主机上访问端口 8088,您将会被转发到容器的端口 80。
  • nginx: 这是用于启动容器的镜像名称。在这种情况下,它使用官方的 nginx 镜像。如果本地没有这个镜像,Docker 会自动从 Docker Hub 下载它。
powershell
docker cp https-nginx:/etc/nginx/nginx.conf nginx.conf
powershell
docker cp https-nginx:/etc/nginx/conf.d .
PS C:\Users\Administrator\Desktop\nginx-course\nginx-https> docker cp https-nginx:/etc/nginx/nginx.conf nginx.conf
Successfully copied 2.56kB to C:\Users\Administrator\Desktop\nginx-course\nginx-https\nginx.conf
PS C:\Users\Administrator\Desktop\nginx-course\nginx-https> docker cp https-nginx:/etc/nginx/conf.d .
Successfully copied 3.58kB to C:\Users\Administrator\Desktop\nginx-course\nginx-https\.
PS C:\Users\Administrator\Desktop\nginx-course\nginx-https> code .
PS C:\Users\Administrator\Desktop\nginx-course\nginx-https> ls


    目录: C:\Users\Administrator\Desktop\nginx-course\nginx-https


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----         2024/4/30      3:09                conf.d
-a----         2024/4/30      3:02           1290 localhost.crt
-a----         2024/4/30      3:00           1018 localhost.csr
-a----         2024/4/30      2:59           1732 localhost.key
-a----         2024/2/15      0:13            648 nginx.conf


PS C:\Users\Administrator\Desktop\nginx-course\nginx-https>
nginx
server {
    listen 443 ssl;
    server_name yourdomain.com;

    ssl_certificate /path/to/yourdomain.crt;
    ssl_certificate_key /path/to/yourdomain.key;

    # 其他配置...
}

确保将/path/to/yourdomain.crt/path/to/yourdomain.key替换为你的证书和私钥文件的实际路径。同样,将yourdomain.com替换为你的实际域名。

5. 重启 Nginx

配置完成后,你需要重启 Nginx 以应用这些更改:

bash
nginx -s reload

或者,如果你使用的是 Systemd(如在 Linux 发行版中常见):

bash
systemctl restart nginx

完成

现在,你的 Nginx 服务器应该已经配置为使用自签名 SSL 证书提供 HTTPS 服务了。请记住,由于这是自签名的证书,浏览器会警告该证书不受信任。在生产环境中,你可能会想要从一个受信任的 CA(如 Let's Encrypt)获取一个证书。

OpenSSL Windows 自签名证书

使用 OpenSSL 在 Windows 上生成自签名证书。这需要你首先在你的 Windows 系统上安装 OpenSSL。OpenSSL 是一个强大的开源工具,用于 SSL 和 TLS 协议的实现,它提供了丰富的命令行工具来创建密钥、证书等。以下是使用 OpenSSL 生成自签名证书并将其添加到 Windows 受信任根证书颁发机构的详细步骤:

步骤 1: 安装 OpenSSL

  1. 下载 OpenSSL 的 Windows 版本。可以从官方网站或第三方提供的预编译版本(如Win32/Win64 OpenSSL)获取。
  2. 安装 OpenSSL 并确保将其添加到系统的环境变量中,以便可以从命令行访问。

步骤 2: 生成自签名证书

打开命令提示符或 PowerShell,然后使用以下命令:

  1. 生成私钥(如果你已经有私钥,可以跳过这一步):

    bash
    openssl genrsa -out myserver.key 2048

    这将生成一个 2048 位的 RSA 私钥,并保存到myserver.key文件中。

  2. 生成证书签名请求(CSR)(可选,直接生成自签名证书时不需要):

    bash
    openssl req -new -key myserver.key -out myserver.csr

    在生成 CSR 过程中,系统会询问一系列问题,如组织名称、常用名称(CN,即域名或 IP 地址)等。对于自签名证书,这些信息是自我声明的。

  3. 生成自签名证书

    bash
    openssl req -x509 -days 365 -key myserver.key -in myserver.csr -out myserver.crt

    如果你跳过了生成 CSR 的步骤,可以直接使用以下命令生成自签名证书:

    bash
    openssl req -new -x509 -days 365 -key myserver.key -out myserver.crt

    这将创建一个有效期为 365 天的自签名证书。

步骤 3: 将证书添加到受信任的根证书颁发机构

  1. 打开 Microsoft 管理控制台(MMC)

    • 按下Windows键,输入mmc并按Enter,可能需要以管理员身份运行。
  2. 添加证书管理单元

    • 在 MMC 中,选择文件 > 添加/删除管理单元
    • 从列表中选择证书,点击添加
    • 选择计算机帐户,点击下一步
    • 选择本地计算机,点击完成
    • 返回到添加/删除管理单元对话框,点击确定
  3. 导入证书到受信任的根证书颁发机构

    • 在左侧面板中,展开证书(本地计算机) > 受信任的根证书颁发机构,右键点击证书文件夹,选择所有任务 > 导入
    • 使用导入向导选择之前生成的.crt文件,并完成导入过程。

完成上述步骤后,你的自签名证书就会被添加到 Windows 受信任的根证书颁发机构中,浏览器和其他依赖系统信任存储的应用程序将信任这个证书。这对于本地开发和测试是非常有用的,但请记住,自签名证书不应用于生产环境中。对于生产环境,请考虑使用受信任的 CA 颁发的证书。

信任自签名证书

windows 如何信人自签名证书 Windows 信任自签名证书的方法如下

  1. 在注册表 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL 路径下添加 ClientAuthTrustMode,类型为 REG_DWORD,值为 2。
  2. 在 mmc 的当前本地计算机的受信任的根证书颁发机构下添加自签名证书的根证书即可。