局域网搭建SSL,使用HTTPS服务教程

局域网搭建SSL,使用HTTPS服务教程

1 相关证书文件格式

1.1 .csr(证书请求文件)

.csr 是证书请求文件(certificate signing request),是由 RFC 2986定义的PKCS10格式,包含部分/全部的请求证书的信息,比如,主题, 机构,国家等,并且包含了请求证书的公玥,这些被CA中心签名后返回一张证书。返回的证书是公钥证书(只包含公玥不含私钥)

1.2 .pem(容器格式,证书的加密格式)

.pem 是一种容器格式,可能仅包含公钥证书,也可以包含完整的证书链(包括公玥,私钥,和根证书)。也可能用来编码 CSR文件。

1.3 .key(私钥文件,私钥的加密格式)

.key 其实就是一个pem格式只包含私玥的文件,.key 作为文件名只是作为一个明显的别名。

pem和key 这两种格式 分别存储的是证书base64加密和私钥base64加密还有格式分割符,也就是说pem存的是证书,key 存的是私钥

1.4 .pkcs12 .pfx .p12(公私钥、证书)

pkcs即 RSA定义的 公玥密码学( Public-Key Cryptography Standards)标准,有多个标准 pkcs12只是其一,是描述个人信息交换语法标准。 有的文件直接使用其作为文件后缀名。这种文件包含公钥和私钥证书对,跟pem文件不同的是,它的内容是完全加密的。 用openssl可以把其转换成包含公玥和私玥的 .pem 文件。命令: openssl pkcs12 -in file-to-convert.p12 -out converted-file.pem -nodes

1.5 .der(一种编码方案)

其实der不是一种文件格式。der 是ASN.1 众多编码方案中的一个,使用der编码方案编码的pem文件。der 编码是使用二进制编码,一般pem文件使用的是base64进行编码,所以完全可以把der编码的文件转换成pem文件,命令: openssl x509 -inform der -in to-convert.der -out converted.pem 使用der编码的pem文件,后缀名可以为.der,也可以为以下格式:

1.6 .cert .cer .crt(证书)

pem或者der编码格式的证书文件,这些文件后缀名都会被windows 资源管理器认为是证书文件。有趣的是, .pem 反而不会被认为是证书文件。

1.7 .crl(证书吊销列表)

certificate revocation list,证书吊销列表

在这里插入图片描述

2 实战(SpringBoot+tomcat)

2.1 创建证书

jdk自带的keytool可以帮助我们生成证书

  1. win+R输入cmd打开命令行
keytool -genkey -alias tomcat -storetype PKCS12 -keyalg RSA -keysize 2048 -keystore keyword.p12 -validity 3650

输入密码(密码是隐藏的,直接输入即可),剩下的可以不输,直接全部回车,执行完之后会在当前文件夹内生成一个keyword.p12的文件
在这里插入图片描述

2.2 拷贝证书到项目,并配置

  1. 拷贝证书到resources目录下
    在这里插入图片描述
  2. 在pom.xml中进行配置

放到<build>标签下

<resources>
    <resource>
        <directory>src/main/resources</directory>
        <filtering>true</filtering>
        <excludes>
            <exclude>**/*.p12</exclude>
        </excludes>
    </resource>
    <resource>
        <directory>src/main/resources</directory>
        <filtering>false</filtering>
        <includes>
            <include>**/*.p12</include>
        </includes>
    </resource>
</resources>
  1. 配置application.properties
#SSL
server.ssl.key-store=classpath:keyword.p12
server.ssl.key-store-password=cmd窗口时设置的密钥库口令
server.ssl.keyStoreType=PKCS12
server.ssl.keyAlias=tomcat

2.3 添加配置类,重定向将http转为https

  1. 在application.properties中添加配置
http.port=8080
server.port=8090

在这里插入图片描述
2. 添加配置类

@Configuration
public class HttpToHttpsConfig extends WebMvcConfigurerAdapter {
    @Value("${server.port}")
    private int serverPort;

    @Value("${http.port}")
    private int serverHttpPort;

    /**
     * 解决跨域问题
     * @param registry
     */
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                // 设置允许跨域请求的域名
//                .allowedOrigins("*")    // 注意此处,当allowCredentials为ture时候,此处不能有*
                .allowedOriginPatterns("/**")
                //是否允许证书
                .allowCredentials(true)
                .allowedOrigins("*")
                .allowedMethods("GET", "POST", "OPTIONS", "PUT")
                .allowedHeaders("Content-Type", "X-Requested-With", "accept", "Origin", "Access-Control-Request-Method",
                        "Access-Control-Request-Headers","accessToken")
                .exposedHeaders("Access-Control-Allow-Origin", "Access-Control-Allow-Credentials")
                .maxAge(3600);
    }

    @Bean
    public ServletWebServerFactory servletContainer() {
        TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory () {
            @Override
            protected void postProcessContext(Context context) {
                SecurityConstraint securityConstraint = new SecurityConstraint();
                securityConstraint.setUserConstraint("CONFIDENTIAL");
                SecurityCollection collection = new SecurityCollection();
                collection.addPattern("/*");
                securityConstraint.addCollection(collection);
                context.addConstraint(securityConstraint);
            }
        };

        tomcat.addAdditionalTomcatConnectors(initiateHttpConnector());
        return tomcat;
    }

    private Connector initiateHttpConnector() {
        Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
        connector.setScheme("http");
        //需要重定向的http端口
        connector.setPort(serverHttpPort);
        connector.setSecure(false);
        //设置重定向到https端口
        connector.setRedirectPort(serverPort);
        return connector;
    }
}

2.4 测试效果

  1. 编写一个简单的controller
@RestController
public class TestController {

    @GetMapping("/test")
    public String testHttps(){
        return "success...";
    }
}
  1. 浏览器输入url,回车,查看结果
http://localhost:8080/test

在这里插入图片描述

3 Nginx搭建https服务(linux)

3.1 安装Nginx

搭建nginx之前,我们需要先让linux服务器上有nginx

# 查看当前电脑上是否有nginx
find / -name "nginx"

如果没有,可通过以下步骤来安装nginx:

nginx安装的时候不指定安装目录,会默认安装到/usr/local/nginx下

  1. 安装所需依赖
yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel
  1. 下载nginx
mkdir /temp
cd /tmp/
wget http://nginx.org/download/nginx-1.13.7.tar.gz
  1. 解压nginx
tar -xvf nginx-1.13.7.tar.gz
  1. 创建目标文件夹
mkdir -p /usr/zi/nginx
  1. 进入压缩包所在路径,并指定编译路径
cd /tmp/nginx-1.13.7
./configure --prefix=/usr/zi/nginx
make && make install

此时在/usr/zi/nginx下将会生成conf、sbin等文件夹

  1. 指定配置文件
/usr/zi/nginx/sbin/nginx -c /usr/zi/nginx/conf/nginx.conf
  1. 关闭防火墙
systemctl stop firewalld

# 关闭防火墙开机自启动
systemctl disable firewalld
  1. 启动nginx
/usr/zi/nginx/sbin/nginx -s reload

如果出现:nginx: [error] invalid PID number “” in “/usr/zi/nginx/logs/nginx.pid”,指定配置文件路径,然后重启nginx

# 指定nginx配置文件路径
/usr/zi/nginx/sbin/nginx -c /usr/zi/nginx/conf/nginx.conf
 
# 重启nginx
./nginx -s reload
  1. 在浏览器直接输入自己的ip,回车,出现Welcome to nginx!则表示nginx运行成功

3.2 nginx添加SSL模块

在添加模块之前,首先查看nginx是否有SSL模块

# 进入nginx的sbin目录(根据自己的位置,修改路径)
cd /usr/zi/nginx/sbin

# 查看是否有ssL模块【注意,是大写的V,小写的是显示版本号】
./nginx -V

如果出现 (configure arguments: --with-http_ssl_module), 则已安装,否则需要执行下面命令安装SSL

在这里插入图片描述

可以看到,当前我的nginx是不存在SSL模块的,下面我将安装SSL模块。
①进入nginx源码所在位置(nginx解压缩的目录),我的是在/tmp/nginx-1.13.7

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

②执行make,重新,切记不要执行make install,否则会重新安装

make

执行结束后,在nginx的解压缩目录(我的是在/temp/nginx-1.13.7)将会出现objs文件夹,文件夹内存在nginx文件

在这里插入图片描述

在这里插入图片描述

③替换sbin目录

接下来使用新的nginx文件替换掉之前安装目录sbin下的nginx,注意这里的替换的时候可以先将之前的文件备份下,停掉nginx服务

# 进入nginx的sbin目录
cd /usr/zi/nginx/nginx

# 停止服务
./nginx -s stop

# 替换sbin目录
cp /temp/nginx-1.13.7/objs/nginx /usr/zi/nginx/sbin

④进入nginx安装目录,查看结果

cd /usr/zi/nginx/sbin

#注意这里是大写的V,小写的只显示版本号
./nginx -V  
#出现了configure arguments: --with-http_ssl_module 证明已经安装成功

在这里插入图片描述

3.3 给nginx配置SSL证书

①创建证书,并上传
  • 拥有ssl证书,没有的可以去阿里购买或者免费申请一年【这里是内网环境,因此我们可以本地生成证书】
  • 解压缩下载好的证书(证书一般是pem文件和key文件,这里名字可以随便改)
  • 将下载好的证书上上传到服务器,我将证书放在了root目录下的card文件夹

jdk中内置了一个keytool

JDK里面内置了一个数字证书生产工具:keytool。但是这个工具只能生成自签名的数字证书。所谓自签名就是指证书只能保证自己是完整的,没有经过非法修改的。但是无法保证这个证书是属于谁的(一句话:keytool没办法签发证书,而openssl能够进行签发和证书链的管理)

我们可以在本地下载一个openssl工具:下载地址
在这里插入图片描述
下载完之后,进入安装目录的bin路径,便可以使用,当然也可以配置好环境变量,更方便。

②配置nginx的conf文件

参考文章:
https://blog.csdn.net/jasstool/article/details/98627062
https://blog.csdn.net/HD243608836/article/details/127441701
https://blog.csdn.net/xkdlzy/article/details/113380587
https://www.cnblogs.com/ambition26/p/14077773.html

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值