nginx配置java的https服务

本文详细介绍了如何在本地生成SSL证书,包括使用openssl创建自签名证书,以及如何在Nginx中配置HTTPS服务,包括安装SSL模块、设置SSL参数和证书路径。还解决了SSL_key需要输入密码的问题以及提供了解决方案。

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

本地生成证书

在当前文件夹生成ssl证书(相关参数自己调整)
注意:ssl证书的位置要和nginx配置文件的位置要在同一文件夹下 建议在/usr/local/nginx/conf文件夹下创建cert文件夹来存放

bash`openssl req -x509 -newkey rsa:4096 -keyout ssl.key -out ssl.crt -days 365`
参数说明
openssl req这是OpenSSL的请求模块,用于创建和处理证书请求。
-x509这个选项告诉OpenSSL我们不是创建一个证书请求,而是直接创建一个自签名的X.509证书。
-newkey rsa:4096这会生成一个新的4096位的RSA私钥。
-keyout ssl.key这指定了将生成的私钥保存到ssl.key文件。
-out ssl.crt这指定了将生成的证书保存到ssl.crt文件。
-days 365这设置了证书的有效期为365天。

配置ssl证书参数

Enter PEM pass phrase:                                              // 自定义输入PEM密码
Verifying - Enter PEM pass phrase:                              	//  确认密码
-----
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]:shagnhai       				// 所在省市简称
Locality Name (eg, city) []:shanghai                            			// 所在城市简称
Organization Name (eg, company) [Internet Widgits Pty Ltd]:baidu      		// 公司简称
Organizational Unit Name (eg, section) []:leader                         	// 职位简称
Common Name (e.g. server FQDN or YOUR name) []:wxl     						// 用户名称
Email Address []:xxxxxxxxxxxx@qq.com                                  		// 用户邮箱

执行命令后在当前文件夹生成ssl.crt和ssl.key

nginx配置

安装模块

因为有用到nginx的https模块,先查看当前nginx是否已经添加。打开/usr/local/nginx/sbin/执行命令

nginx -V

查看configure是否已经加载–with-http_stub_status_module --with-http_ssl_module这两个模块

nginx version: nginx/1.25.2
built by gcc 7.3.0 (GCC) 
built with OpenSSL 1.1.1f  31 Mar 2020
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --with-stream

如果没有就需要重新编译。
打开nginx的源码目录,注意是源码目录/usr/local/nginx-1.25.2/ 执行命令

./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module

注意 如果之前configure arguments已经安装过其他模块,这次需要一起加上不然会覆盖掉,比如我之前已经安装过了stream模块

./configure --prefix=/usr/local/nginx --with-stream --with-http_stub_status_module --with-http_ssl_module
make

不要执行make install不然会覆盖掉之前的配置

1,备份nginx文件

cp /usr/local/nginx/sbin/nginx  /usr/local/nginx/sbin/nginx.bak

2,覆盖nginx文件
执行成功以后会在源码目录下的objs中生成一个nginx可执行文件

cp /usr/local/nginx-1.25.2/objs/nginx   /usr/local/nginx/sbin/

3,重启nginx服务

systemctl restart nginx

4,再次进入 /usr/local/nginx/sbin/目录 执行nginx -V查看

nginx version: nginx/1.25.2
built by gcc 7.3.0 (GCC) 
built with OpenSSL 1.1.1f  31 Mar 2020
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --with-stream --with-http_stub_status_module --with-http_ssl_module

配置服务

打开nginx.conf文件添加相关配置

 	server {  
        listen 80;  
        server_name localhost;  # 替换为你的域名或IP地址  
        return 301 https://$server_name$request_uri;  
    }  
    server {  
        listen 443 ssl;  # HTTP到HTTPS的重定向端口  
        server_name localhost;  # 替换为你的域名或IP地址  
        ssl_certificate      cert/ssl.crt; # 替换为你的证书文件的路径  
        ssl_certificate_key  cert/ssl.key; # 替换为你的私钥文件的路径  
        
        # 定义了Nginx支持的SSL/TLS协议版本
        ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;
        # 定义了Nginx支持的加密套件列表
        ssl_ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4;
        # 这意味着在客户端和服务器之间协商SSL/TLS连接时,Nginx会优先选择服务器提供的加密套件,而不是客户端提供的
        ssl_prefer_server_ciphers on;  
    }  

如果你用的不是80端口 则可以在一个server里面配置

	server {  
        listen 8010 ssl;  # HTTP到HTTPS的重定向端口  
        server_name localhost;  # 替换为你的域名或IP地址  
        ssl_certificate      cert/ssl.crt; # 替换为你的证书文件的路径  
        ssl_certificate_key  cert/ssl.key; # 替换为你的私钥文件的路径  
        ...  
    }  

配置完成后重启nginx服务

systemctl restart nginx

测试相关接口或者配置

curl -k https://xxxxx

其他问题

nginx: [emerg] cannot load certificate key "/usr/local/nginx/conf/cert/ssl.key": PEM_read_bio_PrivateKey() failed (SSL: error:2807106B:UI

这个问题是每次执行ssl.key文件的时候都要输入密码,密码就是我们上面创建ssl证书的时候输入的密码,所以我们要进行免密操作

// 进入ssl目录 /usr/local/nginx/conf/cert/

cp ssl.key ssl.key.org
openssl rsa -in ssl.key.org -out ssl.key
### 配置Nginx作为Java服务前端的最佳实践 #### 使用Nginx反向代理Tomcat或其他Java容器 为了使Nginx有效地与Java应用程序协同工作,通常会将Nginx设置为位于像Apache Tomcat这样的Servlet容器之前的反向代理服务器。这种架构不仅提高了安全性,还允许更灵活的内容缓存策略和服务静态文件的能力。 ```nginx upstream java_app { server localhost:8080; } server { listen 80; server_name example.com; location / { proxy_pass http://java_app/; 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-Proto $scheme; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } ``` 这段配置定义了一个名为`java_app`的上游组指向本地运行的Tomcat实例,默认端口为8080[^1]。当请求到达Nginx时,它会被转发给指定的Java应用服务器处理,并且设置了几个HTTP头字段以便于下游的应用程序获取客户端的真实信息。 #### 处理静态资源 对于由Java Web应用产生的静态内容(如图片、CSS样式表和JavaScript脚本),可以直接让Nginx提供这些文件而不必经过较慢的应用层逻辑。这可以通过调整location指令实现: ```nginx location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ { expires max; log_not_found off; } ``` 上述代码片段指示Nginx直接服务于匹配特定扩展名模式下的所有文件,并启用长时间缓存机制以减少重复加载时间。 #### SSL/TLS支持 现代Web开发中不可或缺的一部分就是确保通信的安全性。为此,在生产环境中部署任何基于HTTP服务之前都应考虑实施SSL加密连接。以下是关于如何在Nginx上启用HTTPS的一个简单例子: ```nginx server { listen 443 ssl; server_name www.example.com; ssl_certificate /etc/nginx/ssl/example.crt; ssl_certificate_key /etc/nginx/ssl/example.key; ... } ``` 此部分展示了基本的SSL证书路径设定;实际操作过程中可能还需要额外配置诸如HSTS头部等增强措施来加强整体安全性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值