自签名SSL证书以及nginx配置https服务

2023-11-09

自签名SSL证书以及nginx配置https服务

 

服务器SSL的认证流程

单向认证

  1. 客户端发起建立HTTPS连接请求,将SSL协议版本的信息发送给服务端

  2. 服务器端将本机的公钥证书发送给客户端

  3. 客户端读取公钥证书,取出服务端公钥

  4. 客户端生成一个随机数(秘钥R),用刚才得到的服务器公钥去加密这个随机数行程秘文,发送给服务器

  5. 服务器用自己的私钥去解密这个秘文,得到秘钥R

  6. 客户端和服务端在后续的通讯过程中就是用这个秘钥R进行通信

双向认证

  1. 客户端发起建立HTTPS连接请求,将SSL协议版本的信息发送给服务端

  2. 服务器端将本机的公钥证书发送给客户端

  3. 客户端读取公钥证书,取出服务端公钥

  4. 客户端将客户端公钥证书发送给服务端

  5. 服务器端解密客户端公钥证书,拿到客户端公钥

  6. 客户端发送自己支持的加密方案给服务端

  7. 服务端根据自己和客户端的能力,选择一个双方都能接受的加密方式,使用客户端的公钥加密后发送给客户端

  8. 客户端使用自己的私钥解密加密方案,生成一个随机数R,使用服务器公钥加密之后传给服务端

  9. 服务端用自己的私钥去解密这个秘文,得到秘钥R

  10. 客户端和服务端在后续的通讯过程中就是用这个秘钥R进行通信

不难发现双向认证会比单项认证更安全,当然性能肯定是不如单向

自签名SSL证书

需要生成的证书文件

  • 服务端公钥证书:server.crt

  • 服务端私钥证书:server-privatekey.pem

  • 客户端公钥证书:client.crt

  • 客户端私钥证书:client-privatekey.pem

  • 客户端集成证书(包括公钥和私钥,用于浏览器访问场景):client.p12

在开始生成这一系列证书之前,需要先生成一个CA根证书,通过这个CA根证书颁发服务器公钥和客户端公钥,假装我们是正规的CA机构(手动狗头)

自建CA

  1. 创建私钥privatekey.pem

    openssl genrsa -out privatekey.pem

    如果不指定-out参数2048bit的私钥会直接在命令行打印

    -out为存储路径

  2. 根据私钥生成一个新的证书请求文件

    openssl req -key privatekey.pem -new -out ca.csr
    • -new 生成一个新的证书请求

    • -out 存储路径

    • -key 指定读取私钥的文件路径,这里使用了上一步中生成的私钥文件,如果不指定会先初始化一个私钥

    执行该命令后根据提示完善一些信息

    • Country Name:国家,这里限制输入两个字符,中国是CN

    • State or Province Name:州或者省份

    • Locality Name:城市

    • Organization Name:组织,可以采用公司名

    • Organizational Unit Name:组织单位,有些ca机构没有该内容

    • Common Name:公用名,这里填域名,没有域名的话用服务器的ip

    • Email Address:邮箱,这里我回车跳过了

    • A challenge password:请求文件的密码,可以直接回车跳过

    如果不想要在对话框中依次输入信息,可以执行下面的命令

    openssl req -key privatekey.pem -new -out ca.csr -subj /C=cn/ST=guangdong/L=guangzhou/O=testcompany/OU=testdepartment/CN=test.com
  3. 创建根证书

    openssl x509 -req -in ca.csr -out ca.crt -signkey privatekey.pem -CAcreateserial -days 365

    x509是一个多功能的证书命令。可以用来展示证书信息、转换证书格式、像mini CA一样签名证书请求或者修改证书信任设置

    • -in 输入文件的读取路径

    • -out 输出文件的存储路径

    • -signkey 私钥文件路径

    • -CAcreateserial 避免没有CA serial number file(该文件只有一行,包含偶数个十六进制的字符)时候的报错。没有的话这里会自动创建一个。

    • -days 证书有效天数

生成服务器端证书

  1. 生成证书私钥

    openssl genrsa -out server-privatekey.pem
  2. 使用私钥生成服务器端证书的请求文件

    openssl req -key server-privatekey.pem -new -out server.csr -subj /C=cn/ST=guangdong/L=guangzhou/O=testcompany/OU=testdepartment/CN=test.com

    这里我直接沿用了CA证书时候的参数,不然开启SSL双向认证的时候无法正常请求

  3. 生成服务器端证书

    openssl x509 -req -in server.csr -out server.crt -signkey server-privatekey.pem -CA ca.crt -CAkey privatekey.pem -CAcreateserial -days 365

    大部分参数在生成CA证书的时候都有使用,这里说明一下两个之前未使用到的参数

    • -CA 使用的CA证书

    • -CAkey 使用的CA证书私钥

如果不使用SSL双向认证的话,到这里就可以了,服务端开启ssl有服务端证书server.crt和服务端证书server-privatekey.pem就够了,nginx配置如下

server {
        #SSL 默认访问端口号为 443
        listen 9090 ssl;
        #请填写绑定证书的域名
        #server_name cloud.tencent.com;
        #请填写证书文件的相对路径或绝对路径
        ssl_certificate cert/server.crt;
        #请填写私钥文件的相对路径或绝对路径
        ssl_certificate_key cert/server-privatekey.pem;
        # ssl_client_certificate cert/client.crt;
        # ssl_verify_client on;
        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;
        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        # ...
        # ...
}

生成客户端证书

生成客户端证书的过程基本上和生产服务端证书一致

  1. 生成客户端证书私钥

    openssl genrsa -out client-privatekey.pem
  2. 使用证书私钥生成客户端证书请求文件

    openssl req -key client-privatekey.pem -new -out client.csr -subj /C=cn/ST=guangdong/L=guangzhou/O=testcompany/OU=testdepartment/CN=test.com

    沿用了CA证书时候的参数

  3. 生成客户端证书

    openssl x509 -req -in client.csr -out client.crt -signkey client-privatekey.pem -CA ca.crt -CAkey privatekey.pem -CAcreateserial -days 365
  4. 生成p12格式的证书

    openssl pkcs12 -export -clcerts -in client.crt -inkey client-privatekey.pem -out client.p12

    pkcs12命令用于生成或者转换p12文件

    • -export 生成pkcs#12文件

    • -clcerts 只输出客户端证书

    • -in 输入文件

    • -inkey 私钥

    • -out 输出

nginx配置

server {
        #SSL 默认访问端口号为 443
        listen 443 ssl;
        #请填写绑定证书的域名
        #server_name cloud.tencent.com;
        #请填写证书文件的相对路径或绝对路径
        ssl_certificate cert/server.crt;
        #请填写私钥文件的相对路径或绝对路径
        ssl_certificate_key cert/server-privatekey.pem;
        #客户端证书
        ssl_client_certificate cert/client.crt;
        #校验客户端证书
        ssl_verify_client on;
        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;
        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        # ...
        # ...
    }

这里开启了校验客户端证书,校验的话可以注释掉ssl_verify_client on;

到这里想要访问服务的话就必须要在客户端导入clien.p12证书,否则客户端请求的时候就会报错

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

自签名SSL证书以及nginx配置https服务 的相关文章

  • RabbitMq 和“致命错误:握手失败 -handshake_decode_error”

    我正在使用 Windows Server 2012 Erlang 19 2 和 RabbitMq 3 6 6 我在使用 TLS 配置端点之间的连接时遇到问题 我已经尝试了所有关于 SO 的答案 以及所有 RabbitMq 文档here ht
  • 在 Go 中使用电子邮件地址创建证书签名请求 (CSR)

    我尝试使用 crypto x509 包生成 CSR 但没有找到将 emailAddress 字段添加到其主题中的方法 根据文档证书申请 http golang org pkg crypto x509 CertificateRequest结构
  • 强制 nginx 立即关闭连接

    如何让nginx在请求完成后立即关闭tcp连接 我刚刚找到了解决方案 location ip keepalive timeout 0
  • 使用 iOS 分布式应用程序时 Google Cloud Messaging 显示“notRegistered”

    我在 iOS 应用程序上实现了 GCM 服务 我使用 PHP 在服务器上发送 GCM 当应用程序由开发配置文件签名时 它可以完美运行 也就是说 当应用程序使用 GCM 配置注册自身时 它始终返回一个正常运行的设备令牌 我可以使用令牌向设备发
  • 当 ssl 和 http2 打开时,Nginx 似乎忽略 server_name

    我有这个 nginx 配置 server listen 80 default server listen 80 default server server name www example com return 301 https www
  • SSLContext 初始化

    我正在看JSSE参考指南 我需要获取一个实例SSLContext为了创建一个SSLEngine 所以我可以使用它Netty以启用安全性 获取实例SSLContext I use SSLContext getInstance 我看到该方法被重
  • 使用 nginx 在云上部署 django 和 React

    我有一个 digitalocean 服务器 并且已经使用 Gunicorn 和 nginx 部署了 Django 后端服务器 如何在同一台服务器上部署 React 应用程序 您可以构建 React 应用程序并使用 Nginx 提供其静态文件
  • nginx - 禁用特定 URL 的 HTTPS 重定向

    我将 nginx 设置为将所有 HTTP 请求重定向到 HTTPS 如下所示 Redirect every request to HTTPS server listen 80 listen 80 server name sub exampl
  • 使用 HTTPS 时我需要/想要 gzip 压缩吗?

    使用 HTTPS 是否已经包含 透明 内容压缩 或者我是否仍然应该担心与浏览器协商是否压缩我的 Servlet 输出 如果 HTTPS 已经有压缩 是无条件的还是需要配置 协商 启用 默认情况下 TLS 不启用压缩 但它 压缩 是在 TLS
  • Apache + Symfony2 + HTTPS + Node.js + Socket.io:socket.emit 未触发

    我花了几个小时来解决这个问题 但毫无结果 编辑 找到解决方案 参见我的答案 项目背景 我正在构建一个项目Symfony2 这需要一个用于上传大文件的模块 我选择了Node js and Socket IO 我必须从头开始学习 所以我可能会错
  • Access-Control-Allow-Origin值跨站缓存

    我正在尝试编写一个 nginx 配置来处理 http 和 https 上的两个站点 只要客户端从不访问这两个站点 它似乎就可以工作 但如果它们这样做 就会出现缓存 跨站点问题 Allow cross origin location eot
  • 使用 WebClient 时出现 System.Net.WebException:无法创建 SSL/TLS 安全通道

    当我执行以下代码时 System Net ServicePointManager ServerCertificateValidationCallback sender certificate chain errors gt return t
  • SSL 适用于浏览器、wget 和curl,但不适用于 git

    我有一个网站 用于托管 redmine 和几个 git 存储库 这非常适合 http 但我无法使用 https 进行克隆 即 git clone http mysite com git test git 工作正常 但是 git clone
  • SSL 和会话劫持/固定

    快问 SSL 是否完全防止会话劫持 固定 谢谢 不可以 例如 在以下情况下可能会发生劫持 被黑客入侵的 CA 根签署无效证书 该证书可用于发起中间人攻击 被黑客攻击的域名所有者电子邮件收件箱使黑客有可能购买经过域名验证的证书 错误的密钥策略
  • PHP-FPM 和 Nginx:502 错误网关

    配置 Ubuntu 服务器 11 10 64 位 亚马逊AWS Ec2 托管在云上 t1 micro实例 在我写任何其他内容之前 我想声明我已经检查了两者nginx 502 错误网关 https stackoverflow com ques
  • 为什么我需要 Nginx 和 Puma?

    我正在将 Rails 应用程序部署到生产环境中 看起来 Puma 速度很快 可以处理我想要在网络服务器中完成的许多事情 我想知道我是否需要使用 Nginx 如果只使用 Puma 我会错过什么 Nginx 是一个 Web 服务器 puma 是
  • 如何使用 Nginx 将下划线替换为破折号

    我第一次使用Nginx 对它基本上一无所知 我需要将 100 多个 URL 中的 替换为 我想一定有一种简单的方法可以用 Nginx 来做到这一点 但在 Google 上找不到任何东西 Thanks Edit 我的网址例如 http www
  • javax.net.ssl.SSLException:没有可用的 PSK。无法恢复

    我正在使用 Jetty 客户端发送传出请求 在 Java 10 下完美运行的代码在 Java 11 下突然出现以下异常 javax net ssl SSLException No PSK available Unable to resume
  • Maven:无法传输文件 XXX 返回代码为: 501 ,ReasonPhrase:HTTPS 必需

    我在构建 Maven 项目时收到意外的 501 错误代码 该消息显示需要 HTTPS 但我没有更改我的 settings xml 如何检查我的配置是否发生更改 我怎样才能让事情正常运转 其原因解释于Maven 依赖项失败并出现 501 错误
  • 使用 SSL 证书验证 Web 浏览器

    是否可以使用 ssl 证书对 Web 浏览器进行身份验证 假设我在应用程序中存储私钥 有什么方法可以从浏览器读取密钥并尝试基于该私钥进行身份验证 您可以使用 SSL TLS 客户端证书身份验证来对浏览器 用户进行身份验证 服务器必须请求客户

随机推荐

  • Qt类中使用函数指针数组

    接上文例子 将其改成函数指针数组 class Widget public QWidget public int add int x int y int mul int x int y int Widget func p 2 int x in
  • RN 使用第三方组件之react-native-image-picker(拍照/从相册获取图片)

    首先给个github地址 https github com react community react native image picker 英文不行的看下面这个笔记 该插件可以同时给iOS和Android两个平台下使用 但是需要配置下各
  • 京东如何处理数据中心网络对应用性能的影响

    随着现代数据中心规模的不断扩张 网络拓扑和路由转发变得越来越复杂 传统的数据中心使用大型机和小型机 网络规模相对较小 普通的机框式交换机就能满足网络的需求 随着CLOS集群架构的普及 标准的x86服务器集群以低成本和高扩展性逐渐取代大型机和
  • 解决:Failed to connect to repository : Error performing command: git.exe ls-remote -h xxxxxxx HEAD...

    在jenkins新建工程 配置源码管理时 发现输入gitlab的Repository URL 总会抛出一个错误 后来在网上各种百度 终于找到了一篇比较靠谱的文章 顺着文章的提示 去Manage Jenkins Global Tool Con
  • linux 新建文件夹命令

    今天学习了几个命令 是创建 删除文件和文件夹的 在linux里 文件夹是目录 下面说下我学习的命令 创建文件夹 mkdir 一 mkdir命令使用权限 所有用户都可以在终端使用 mkdir 命令在拥有权限的文件夹创建文件夹或目录 二 mkd
  • 集成学习-Voting

    一 什么是集成学习 集成学习是使用一系列学习器进行学习 并使用某种规则把各个学习结果进行整合从而获得比单个学习器更好的学习效果的一种机器学习方法 一般情况下 集成学习中的多个学习器都是同质的 弱学习器 上面的描述来自百度百科 看定义的话知道
  • Qt关于QProcess使用startDetached函数问题

    最近项目编写自动升级程序使用进程通讯 网上查看大部分资料都使用QProcess类 再使用函数startDetached过程发现一种很奇怪现象 父进程通过startDetached调用子进程 原则上父进程和子进程脱离关系 关闭父进程不会关闭子
  • PyQt5无法导入QtCore问题解决

    今天安装PyQt 执行下面语句的时候出现问题 python3 configure py pyqt PyQt5 搞了一下午 吐血 具体 import PyQt5 完全ok 但是 from PyQt5 import QtCore 就出错 就这个
  • 07:MYSQL----多表查询

    目录 1 多表查询概述 2 多表查询分类 3 内连接 3 外连接 4 自连接 5 联合查询 union union all 6 子查询 1 多表查询概述 select from emp dept emp 表中有6条数据 dept表中有5条数
  • STM32外部中断 中断优先级讲解及配置

    1 概念 对于几乎所有的微控制器 中断都是一种常见的特性 中断一般是由硬件 如外设和外部输入引脚 产生的事件 它会引起程序流偏离正常的流程 如给外设提供服务 转去执行其他的流程 CPU在正常执行程序的过程中 由于内部 外部事件的触发或程序的
  • QT 创建可复用查找、替换对话框

    目录 1 查找对话框的实现 2 Qt中的调色板 palette 3 替换对话框的实现 目标 开发一个可以在不同项目间复用的查找替换对话框 1 查找对话框的实现 查找对话框需求分析 查找文本框中的指定字符串 能够指定查找方向 支持大小写敏感查
  • 随机生成6位的字符串验证码,要求包含数字,大小写字母

    package com cheng import java util Random import java util Scanner public class Demo04 static Scanner sc new Scanner Sys
  • c++类型推导

    类型推导 现代c 类型推导分为三个 一个为模板函数的形参推演 一个为auto的类型推导 一个decltype的类型推导 auto的类型推导是以模板函数的类型推导为基础的 模板函数类型推导 推导过程 模板函数的类型推导 是通过调用表达式即实参
  • openGL之API学习(七十七)glDrawElements

    通过索引方式来绘制几何图元 如果要 glDrawArrays 和 glDrawElements 正确进行绘制的话 必须在之前 调用带有相应参数的 glEnableClientState 方法 glDrawArrays使用的是顶点 而glDr
  • 查看linux centos ftp服务,Centos7开启FTP服务

    一 查看并安装vsftpd 执行以下命令进行查看 vsftpd v 如果没有安装的话就执行以下命令进行安装 yum y install vsftpd 二 配置vsftpd 2 1 取消匿名登陆 修改vsftpd conf文件 vi etc
  • huggingface ,Trainer() 函数是 Transformers 库中用于训练和评估模型的主要接口,Trainer()函数的参数如下:

    model required 待训练的模型 必须是 PyTorch 模型 args required TrainingArguments 对象 包含训练和评估过程的参数 例如训练周期数 学习率 批量大小等 train dataset opt
  • Linux用户空间和内核空间的内存互访

    Linux用户空间和内核空间的内存互访 标签 虚拟内存 安全性 Linux 用户 2012 11 13 15 55 Linux 内存 在 Linux 中 用户内存和内核内存是独立的 在各自的地址空间实现 地址空间是虚拟的 就是说地址是从物理
  • 在导入NVIDIA的apex库时报错 ImportError cannot import name ‘UnencryptedCookieSessionFactoryConfig‘ from

    在导入NVIDIA的apex库时报错 ImportError cannot import name UnencryptedCookieSessionFactoryConfig from pyramid session unknown loc
  • stm32定时器中断的配置步骤

    stm32定时器中断的配置步骤 1 TIM3 时钟使能 位于低速的APB1总线上 注意 高级定时器是在高速的APB2总线上 RCC APB1PeriphClockCmd RCC APB1Periph TIM3 ENABLE 时钟使能 2 初
  • 自签名SSL证书以及nginx配置https服务

    自签名SSL证书以及nginx配置https服务 服务器SSL的认证流程 单向认证 客户端发起建立HTTPS连接请求 将SSL协议版本的信息发送给服务端 服务器端将本机的公钥证书发送给客户端 客户端读取公钥证书 取出服务端公钥 客户端生成一