Nginx 下将 http 改为 https

本文详细介绍了如何将服务从HTTP升级到HTTPS,包括获取SSL证书(自签名和第三方)、安装OpenSSL、配置Nginx以支持HTTPS,以及处理HTTP到HTTPS的重定向。特别提到了自签名证书在测试和内部环境的应用,以及使用CDN如CloudFlare提供的免费SSL选项。

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

将服务从 HTTP 变为 HTTPS,需要进行 SSL 证书的配置。需要完成一下步骤:

  1. 获取 SSL 证书
  2. 安装 SSL 证书
  3. 配置 Nginx 支持 HTTPS
  4. 重启 Nginx
  5. HTTP 到 HTTPS 的重定向(可选)

1. 获取 SSL 证书(自签名证书)

对于 SSL/TLS 证书,一般来说,它们是基于 域名 进行颁发的,而不是 IP地址。这是因为 SSL/TLS 证书是用来验证服务器身份和提供一个安全的连接通道的,它们需要关联到一个被认可的域名以确保服务器的真实性。

如果你没有 域名,但是你的应用又需要使用 HTTPS,那么以下几种方式或许可以考虑:

  1. 购买一个域名:
    域名现在相当便宜,你可以购买一个,并将其解析到你的 IP 地址。
  2. 自签名证书:
    可以创建自己的自签名证书。但是,用户的浏览器会显示一个警告,提示他们证书不受信任。这可能不适合面向公众的应用程序,但对于测试或内部使用的服务来说,这是一个可行的选择。
  3. 使用 CloudFlare
    CloudFlare 是一个内容分发网络(CDN)和 DNS 提供商,它提供免费的 SSL 证书,即使你没有域名也可以使用。但是,这需要将你的流量通过他们的网络,可能并不适合所有应用。

1.1. 安装 openssl

// 更新 apt-get 下载源节点
sudo apt-get update

// 查看当前 apt-get 下载源节点里 libssl-dev 可下载安装的所有版本和默认的最合适的版本
sudo apt-cache policy libssl-dev

// 下载并默认安装 libssl-dev(默认的版本)
sudo apt-get install libssl-dev

// 如果要指定安装某个版本
//sudo apt-get install libssl-dev=版本号

1.2. 自签名证书

使用 OpenSSL 工具来创建自己的自签名证书

  1. 生成私钥
    打开命令行,然后输入以下命令来生成一个新的 RSA 私钥:openssl genrsa -out server.key 2048,将在当前目录下生成一个名为 server.key 的 2048 位私钥文件。
  2. 生成证书签名请求(CSR)
    使用此命令生成 CSR(Certificate Signing Request):openssl req -new -key server.key -out server.csr,会提示输入很多东西,一直按 enter 即可
  3. 生成自签名证书
    最后,使用以下命令生成自签名证书:openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt,这将生成一个有效期为一年的自签名证书 server.crt

1.3. 尝试在 flask 应用中使用

from flask import Flask


app = Flask(__name__)


@app.route("/")
def index():
    return "Hello World"


if __name__ == "__main__":
    app.run(ssl_context=('server.crt', 'server.key'), host='0.0.0.0', port=8080)
    #app.run(host='0.0.0.0', port=8080)

这样,Flask 服务器就会在 HTTPS 上运行了。但是,请注意,因为使用的是自签名证书,所以浏览器将警告用户这个连接不安全(因为证书不是由受信任的证书颁发机构签署的)。对于公开服务,应该考虑获得一个由公认的 CA 签署的证书。

  • 直接在 flask 中使用 ssl 证书的示意图:

    image

     

    image

2. 安装 SSL 证书

将上面生成的 SSL 证书文件放置到位于 /etc/nginx/ssl/ 目录中。确保已经拥有了服务器私钥(server.key)和证书文件(server.crt 或 server.crt)。

3. 配置 Nginx 支持 HTTPS

3.1. 打开 Nginx 配置文件

Nginx 的配置文件通常位于 /etc/nginx/ 目录下,具体取决于你的系统和 Nginx 安装方式。大部分情况下,站点特定的配置在 /etc/nginx/sites-available/ 中。

3.2. 修改或增加一个server块

在 /etc/nginx/sites-available/default 配置文件中,将文件中的内容全部替换为下面的 server 模块(或者新建一个使用 SSL 的 server 块),内容如下:

server {
    listen 443 ssl;
    server_name _;
    # server_name your-domain.com;                  # 没有域名则直接写一个下划线即可

    ssl_certificate /etc/nginx/ssl/server.crt;      # 修改为证书路径
    ssl_certificate_key /etc/nginx/ssl/server.key;  # 修改为私钥路径

    location / {
        proxy_pass http://127.0.0.1:8080;           # 修改为 http 服务地址
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}
  • 替换 your-domain.com 为真实的域名,没有域名则直接写一个下划线(_)即可。
  • listen 443 ssl 告诉 Nginx 在 443 端口上监听 SSL 连接。
  • ssl_certificate 和 ssl_certificate_key 指令分别指向你的证书文件和私钥文件的实际路径。

4. 重启 Nginx

保存并关闭配置文件,然后运行以下命令来检查新的配置是否有语法错误:

sudo nginx -t

如果这个命令没有报错,就可以安全地重启 Nginx:

sudo systemctl restart nginx

nginx 重启成功后,将可以在浏览器上通过 https 访问服务器应用了。由于使用的是自签名证书,用户的浏览器将显示一个警告,提示他们此证书不受信任。这对于测试和开发环境可能没问题,但是如果计划在生产环境中使用 SSL,应该考虑从一个可信的证书颁发机构获取一个证书。

  • 使用 nginx 作为反向代理后,使用 ssl 证书的示意图:

    image

     

    image

5. HTTP 到 HTTPS 的重定向(可选)

如果希望所有的 HTTP 流量都自动跳转到 HTTPS,可以在 Nginx 配置中添加以下内容:

server {
    listen 80;
    server_name your-domain.com;
    return 301 https://$host$request_uri;
}

这段配置会捕获所有到端口 80(HTTP) 的请求,并将它们重定向到相同地址的 HTTPS 版本。

### 将Java项目中的HTTP配置修改为HTTPS #### 1. 准备SSL/TLS证书 为了启用HTTPS,首先需要准备一个有效的SSL/TLS证书。可以使用自签名证书用于开发环境测试,生产环境中建议购买由受信任CA签发的证书[^1]。 对于Spring Boot应用而言,在本地调试阶段可以通过`keytool`命令来创建自签名证书并将其存储于密钥库文件中: ```bash keytool -genkeypair -alias selfsigned -keyalg RSA -keysize 2048 -storetype PKCS12 -keystore keystore.p12 -validity 3650 ``` 此命令会提示输入一些必要信息以及设置密码,请妥善保管这些数据以便后续引用[^6]。 #### 2. 修改application.properties或application.yml配置文件 针对采用默认内嵌Tomcat容器启动方式的应用程序来说,只需调整其资源配置即可完成协议切换操作。具体做法是在项目的`src/main/resources/application.properties`或者`application.yml`里加入如下参数定义[^7]: 如果使用`.properties`格式,则添加以下内容: ```properties server.port=8443 server.ssl.key-store-type=PKCS12 server.ssl.key-store=classpath:keystore.p12 server.ssl.key-password=<your-key-password> ``` 如果是`.yml`格式的话则应如此编写: ```yaml server: port: 8443 ssl: keyStoreType: PKCS12 keyStore: classpath:keystore.p12 keyPassword: "<your-key-password>" ``` 这里指定了服务监听端口为8443,并告知框架关于SSL的相关细节,比如密钥仓库的位置和访问权限等重要事项[^8]。 #### 3. 配置自动重定向至HTTPS 为了让所有的HTTP请求都能够被正确导向到对应的HTTPS地址上,可以在Web应用程序的安全策略里面增加相应的规则实现强制性的URL转发功能[^3]。 当基于XML方式进行安全设定时,可在`web.xml`文档内部追加一段描述安全约束条件的内容片段: ```xml <security-constraint> <web-resource-collection> <web-resource-name>securedapp</web-resource-name> <url-pattern>/*</url-pattern> </web-resource-collection> <user-data-constraint> <transport-guarantee>CONFIDENTIAL</transport-guarantee> </user-data-constraint> </security-constraint> ``` 而若是依赖编程式的Security Configurer API来进行定制化处理,则可通过覆写`configure(HttpSecurity http)`方法达成相同效果: ```java @Override protected void configure(HttpSecurity http) throws Exception { http.requiresChannel() .anyRequest().requiresSecure(); } ``` 上述两种途径均能有效地促使任何未经加密传输的数据包都被迫转向经过SSL保护后的通道继续传递下去[^4]。 #### 4. 更新外部链接指向新的HTTPS URL 最后一步是要确保所有对外公开的服务入口都已更新成为带有`https:`前缀的新形式。这不仅限于API接口调用方所提供的基址变更,还包括但不限于HTML页面内的资源加载路径修正等工作范围之内[^5]。 通过以上几个方面的努力就可以顺利地把原有的纯文本通信模式转变为更加安全可靠的TLS加密机制之下运作了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

野生的狒狒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值