当前位置: 首页 > 编程日记 > 正文

TLS/HTTPS 证书生成与验证

https://www.cnblogs.com/kyrios/p/tls-and-certificates.html

最近在研究基于ssl的传输加密,涉及到了key和证书相关的话题,走了不少弯路,现在总结一下做个备忘

科普:TLS、SSL、HTTPS以及证书

不少人可能听过其中的超过3个名词,但它们究竟有什么关联呢?

  • TLS是传输层安全协议(Transport Layer Security)的缩写,是一种对基于网络的传输的加密协议,可以在受信任的第三方公证基础上做双方的身份认证。TLS可以用在TCP上,也可以用在无连接的UDP报文上。协议规定了身份认证、算法协商、密钥交换等的实现。
  • SSL是TLS的前身,现在已不再更新
  • HTTPS是在基于TLS/SSL的安全套接字上的的应用层协议,除了传输层进行了加密外,其它与常规HTTP协议基本保持一致
  • 证书是TLS协议中用来对身份进行验证的机制,是一种数字签名形式的文件,包含证书拥有者的公钥及第三方的证书信息。

证书分为2类:自签名证书和CA证书。一般自签名证书不能用来进行身份认证,如果一个server端使用自签名证书,client端要么被设置为无条件信任任何证书,要么需要将自签名证书的公钥和私钥加入受信任列表。但这样一来就增加了server的私钥泄露风险。

TLS基于CA的身份认证基本原理是:首先验证方需要信任CA提供方自己的证书(CAcert),比如证书在操作系统的受信任证书列表中,或者用户通过“安装根证书”等方式将 CA的公钥和私钥加入受信任列表;然后CA对被验证方的原始证书进行签名(私钥加密),生成最终的证书;验证方得到最终的证书后,利用CAcert中包含的公钥进行解密,得到被验证方的原始证书。

根据RSA的加密原理,如果用CA的公钥解密成功,说明该证书的确是用CA的私钥加密的,可以认为被验证方是可信的。

下面我们以客户端单方对服务器端进行身份认证场景,来讲解如何做证书的生成。

证书的生成

证书的生成可以用linux的OpenSSL工具链。对于一个网站,首先必须有自己的私钥,私钥的生成方式为:

openssl genrsa -out ssl.key 2048

私钥必须妥善保管,既不能丢失,也不能泄露。如果发生丢失和泄露,必须马上重新生成,以使旧的证书失效。

如果要对私钥进行传输/备份,建议先对私钥进行密码加密:

openssl rsa -in ssl.key -des3 -out encrypted.key

利用私钥就可以生成证书了。OpenSSL使用x509命令生成证书。这里需要区分两个概念:证书(certificate)和证书请求(certificate sign request)

  • 证书是自签名或CA签名过的凭据,用来进行身份认证
  • 证书请求是对签名的请求,需要使用私钥进行签名

x509命令可以将证书和证书请求相互转换,不过我们这里只用到从证书请求到证书的过程

从私钥或已加密的私钥均可以生成证书请求。生成证书请求的方法为:

openssl req -new -key ssl.key -out ssl.csr

如果私钥已加密,需要输入密码。req命令会通过命令行要求用户输入国家、地区、组织等信息,这些信息会附加在证书中展示给连接方。

接下来用私钥对证书请求进行签名。根据不同的场景,签名的方式也略有不同

自签名,生成私有证书

自签名的原理是用私钥对该私钥生成的证书请求进行签名,生成证书文件。该证书的签发者就是自己,所以验证方必须有该证书的私钥才能对签发信息进行验证,所以要么验证方信任一切证书,面临冒名顶替的风险,要么被验证方的私钥(或加密过的私钥)需要发送到验证方手中,面临私钥泄露的风险。

当然自签名也不是一无用处,比如需要内部通讯的两台电脑需要使用加密又不想用第三方证书,可以在两端使用相同的私钥和证书进行验证(当然这样就跟对称加密没有区别了)

自签名的方法为:

openssl x509 -req -in ssl.csr -signkey ssl.key -out ssl.crt

同样如果ssl.key已加密,需要输入密码。

自签名,生成CA证书

CA证书是一种特殊的自签名证书,可以用来对其它证书进行签名。这样当验证方选择信任了CA证书,被签名的其它证书就被信任了。在验证方进行验证时,CA证书来自操作系统的信任证书库,或者指定的证书列表。

生成自签名证书的方法为:

openssl x509 -req -in sign.csr -extensions v3_ca -signkey sign.key -out sign.crt

利用CA证书进行签名

使用CA证书对其它证书进行签名的方法为:

openssl x509 -req -in ssl.csr -extensions v3_usr -CA sign.crt -CAkey sign.key -CAcreateserial -out ssl.crt

花钱购买证书机构的签名

利用上述方法,受信任的机构就可以用自己的私钥(sign.key)对其他人的证书进行签名。我们看到,只需要把证书请求(ssl.csr)发给证书机构,证书机构就可以生成出签名过的证书(ssl.crt)。目前购买证书签名服务的价格大约为100-400元/年。

可选的证书机构有:godaddy startssl namecheap

证书/私钥格式

openssl默认使用PEM格式(形如-----BEGIN CERTIFICATE----- ... ... -----END CERTIFICATE---)存放证书和私钥,nginx/node.js可以使用该格式启动服务。

但使用tomcat或java客户端/android时,不能使用该格式的证书。jdk中包含了一个keytool命令,可以完成整个的证书生成过程,不过这里我们只用openssl工具也可以完成java的支持,即使用PKCS12格式对证书进行打包。

PKCS12格式文件,可以包含多个证书/私钥对,指定多个受信任的server(也可以不包含证书),每个server有一个alias name。我们来看最简单的只包含一个alias的文件生成:

openssl pkcs12 -export -in sign.crt -inkey sign.key -out sign.p12

上面的命令将CA证书及其私钥导出为sign.p12文件,导出时需要指定一个密码。

java客户端程序中对p12文件进行信任

如果我们的服务器使用了自己创建的CA证书签名的证书,或者使用了自签名证书,客户端在使用ssl时,需要将导出的证书文件加入到信任列表中。下面是一段导入证书的示例代码:

复制代码
 1 javax.net.SocketFactory initSSLSocketFactory(InputStream keyin, char[] password) throws Exception {2         java.security.KeyStore keyStore = java.security.KeyStore.getInstance("PKCS12");3         keyStore.load(keyin, password);4         keyin.close();5 6         javax.net.ssl.TrustManagerFactory trustManagerFactory = javax.net.ssl.TrustManagerFactory.getInstance(javax.net.ssl.TrustManagerFactory.getDefaultAlgorithm());7         trustManagerFactory.init(keyStore);8 9         javax.net.ssl.SSLContext sslContext = javax.net.ssl.SSLContext.getInstance("SSL");
10 
11         sslContext.init(null, trustManagerFactory.getTrustManagers(), null);
12 
13         return sslContext.getSocketFactory();
14 }
复制代码

我们得到了一个SocketFactory,可以用它来初始化ssl/https连接。

转载于:https://www.cnblogs.com/liuqiyun/p/9676776.html

相关文章:

高并发系统搭建:web负载均衡

高并发系统搭建:web负载均衡 所谓的负载均衡就是让多个请求尽量均衡的分配到不同的机器上面去 1. HTTP负载均衡 当用户的请求发来之后,web服务器通过修改HTTP响应报头中的Location标记,返回一个新的url,然后浏览器继续请求这个…

centos 7.0 安装mysql_CentOS 7.0yum安装MySQL

1.下载mysql的repo源$ wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm2.安装mysql-community-release-el7-5.noarch.rpm包$ sudo rpm -ivh mysql-community-release-el7-5.noarch.rpm安装这个包后,会获得两个mysql的yum repo源:/…

UVa 11174 - Stand in a Line

http://uva.onlinejudge.org/index.php?optioncom_onlinejudge&Itemid8&pageshow_problem&problem2115 数学的特点在于不断的推导,此题还需要用到 欧拉定理和逆元的相关性质,推荐博客(有部分小错误):http…

计算背板带宽方法

背板带宽:端口数*端口速率*2包转发率:接口带宽(bps)/8bit/(64812)千兆包转发率:1.488Mpps百兆:0.1488Mpps万兆:14.88Mpps例如2950G-48背板2*1000*248*100*213600Mbps13.6Gbps相当于13.6/26.8个千…

Windows下安装PHP开发环境

一、Apache 因为Apache官网只提供源代码,如果要使用必须得自己编译,这里我选择第三方安装包Apache Lounge。 进入Apachelounge官方下载地址:http://www.apachelounge.com/download/首先下载并安装vc redist,这是Apache运行必需的一…

高并发简单设计

系统内存不足,主要是每次来一个请求的时候,就要创建倒排的哈希,这个时候如果高并发的情况下,就会出现问题,每次一个倒排索引占据内存,内存只有2G肯定是不够使用的 可以根据日志分析的结果,看看…

mysql 8.0数据备份恢复_第7章 备份和恢复

## 目录- 备份和恢复类型- 数据库备份方法- 例备份和恢复策略- 使用mysqldump进行备份- 使用二进制日志进行- 点时间(增量)恢复- MyISAM表维护和崩溃恢复备份数据库非常重要,这样您就可以恢复数据,并在发生问题时再次启动并运行,例如系统崩溃…

CSS 实例之打开大门

本个实例主要的效果如下图所示 本案例主要运用到了3D旋转和定位技术。具体步骤如下&#xff1a; 1、首先在页面主体加三个很简单的div标签&#xff1a; <div class"door"><div class"door-l"></div><div class"door-r">…

为 Asp.net 网站新增发送手机短信功能

本文旨在帮助那些为网站发送手机短信正在寻求解决方案还未最终找到解决方案的朋友提供参考。 适合人群 须满足一下条件之一&#xff0c;如果以下3个条件您都不满足&#xff0c;为节约您宝贵的时间&#xff0c;请终止阅读本篇文章。 条件如下&#xff1a; 1.一条短信内容进行短信…

搜索引擎Killed原因排查

问题描述 腾讯云单核2G内存&#xff0c;运行程序的时候&#xff0c;程序有时会挂掉了&#xff0c;设置ulimit -c unlimited之后&#xff0c;想要core文件&#xff0c;结果程序运行的时候&#xff0c;直接提示killed&#xff0c;没有出现core文件 调研查询 killed的原因多是因…

mysql 8.0配置主从同步_MySQL8.0.19开启GTID主从同步CentOS8

前言本次搭建目标为1主2从MySQL主从同步结构。采用CentOS8作为操作系统&#xff0c;IP为[10.0.0.211,10.0.0.212,10.0.0.213]。MySQL版本为8.0.19&#xff0c;端口均采用3306。本文仅讲解主从配置&#xff0c;因此安装MySQL的方式请参考安装文档。GTID模式介绍一、GTID Replica…

IO流总结笔记三

​ 字节流&#xff1a; 抽象基类&#xff1a;InputStream&#xff0c; OutputStream。 字节流可以操作任何数据。注意&#xff1a;字符流使用的数组是字符数组。Char [] chs 字节流使用的数组是字节数组。Byte [] bt 转换流&#xff1a; 特点&#xff1a;1&#xff0c;是字节流…

awk1.0 — awk基础

简介 grep&#xff0c;sed&#xff0c;awk被称为Linux文本处理的三剑客&#xff0c;各有特点 grep&#xff1a;适合文本的匹配和查找 sed&#xff1a;编辑匹配到的文本 awk&#xff1a;对文本进行格式化输出 awk简介 awk的基本语法是 awk [options] Pattern {Actions} …

mysql dump 参数_mysqldump常用参数

收集一些常用的mysqldump命令组合。备份数据库1.导出结构不导出数据 **复制代码代码如下:2.导出数据不导出结构3.导出数据和表结构4.导出特定表的结构导入数据&#xff1a;由于mysqldump导出的是完整的SQL语句&#xff0c;所以用mysql客户程序很容易就能把数据导入了&#xff1…

细心看完这篇文章,刷新对Javascript Prototype的理解

var person{name:ninja}; person.prototype.sayNamefunction(){return this.name; } 分析上面这段代码&#xff0c;看看有没有问题&#xff1f; 没错&#xff0c;这段代码是有问题的&#xff0c;我们可以通过Chrome看一下执行结果&#xff1a; 错误提示说找不到sayName 属性&am…

那些值得回味的MySQL的基础知识

那些值得回味的MySQL的基础知识 MySQL零碎知识点整理 题记&#xff1a; 在如今甚是流行的MySQL中有些基础的知识却是我们日常工作中处理问题容易忘却的一部分,所以不能忘了本&#xff0c;那么我们现在就去回忆那些曾经熟悉的基本吧&#xff0c;废话不多说了 基础常识&#xff…

awk2.0 — awk分隔符

再次重申awk的语法 awk [options] ‘Pattern {Actions}’ file1,file2… awk默认分隔符是空格&#xff0c;分隔符有分为“输入分隔符”和“输出分隔符”。 输入分隔符&#xff1a;awk在处理每一行文本的时候&#xff0c;以默认的空格将文本分隔成一个个单词作为变量。 输出分…

【C++自我精讲】基础系列二 const

【C自我精讲】基础系列二 const 0 前言 分三部分&#xff1a;const用法、const和#define比较、const作用。 1 const用法 const常量&#xff1a;const可以用来定义常量&#xff0c;不可改变&#xff0c;const常量在定义时必须初始化&#xff08;extern修饰时是特例&#xff09;。…

mysql system命令_mysql命令

关闭防火墙和selinux:systemctl stop firewalld.servicesetenforce 0永久关闭防火墙和selinux:systemctl disable firewalld.servicesed -i ‘/^SELINUX/s#enforcing#disabled#g’ /etc/selinux/config安装wget:yum install -y wget国内yum源:wget -O /etc/yum.repos.d/CentOS-…

django教程目录

什么是web框架&#xff1f; Do a web framework ourselves MVC和MTV模式 django的流程和命令行工具 Django的配置文件(settings) Django URL (路由系统) Django Views&#xff08;视图函数&#xff09; Template基础 Models admin的配置 Middleware cache Cookie & Session…

VRRP在企业网中的应用(H3C设备)

一&#xff1a;实验原理①VRRP概述&#xff1a;随着Internet的发展&#xff0c;人们对网络的可靠性的要求越来越高。对于局域网用户来说&#xff0c;能够时刻与外部网络保持联系是非常重要的。通常情况下&#xff0c;内部网络中的所有主机都设置一条相同的缺省路由&#xff0c;…

vue-cli脚手架(框架)

一、创建vue项目 npm install vue-cli -g #-g全局 (sudo)npm install vue-cli -g #mac笔记本vue-init webpack myvue #项目的名字 cd muvue npm install npm run dev 二、目录结构的说明 出现下面这样的图就说明成功了 三、import和require的区别 import一定要放在文件顶部…

poj 1679 次小生成树

次小生成树的求法: 1.Prime法 定义一个二维数组F[i][j]表示点i到点j在最小生成树中的路径上的最大权值。有个知识就是将一条不在最小生成树中的边Edge加入最小生成树时&#xff0c;树中要去掉的边就是Edge连接的两个端点i,j的F[i][j]。这样就能保存找到的生成树时次小生成树。 …

mysql金库模式_Python vault-anyconfig包_程序模块 - PyPI - Python中文网

vaultanyconfig" rel"nofollow">使用加载和转储功能扩展hvac hashicorp vault客户端任何配置。这允许自动混合来自保险库的机密&#xff0c;允许您存储配置填充了所有详细信息的文件保存为机密&#xff0c;然后访问hashicorp保险库将机密加载到内存字典中。支…

awk3.0 — awk变量

awk有一些内置变量和外置变量&#xff0c;内置变量就是awk自带的变量&#xff0c;用户可以拿来直接使用&#xff0c;如FS&#xff0c;OFS等 awk常用内置变量如下几种&#xff1a; FS&#xff1a;输入单词分隔符&#xff0c;默认是空格 OFS&#xff1a;输出单词分隔…

关于yum库的相关问题

局域网共享yum库的两种方式&#xff1a; 一种是基于HTTP的&#xff0c;需要配置httpd。 一种是基于FTP的。需要FTP的支持。 具体设置参数可参照网上的相关教程。 yum库的建立主要涉及到两点&#xff1a; 1、 Yum服务器安装createrepo并创建仓库 2、 安装完成之后&#xff0c;在…

[ JSOI 2015 ] Salesman

\(\\\) \(Description\) 给出一棵以\(1\)为根的\(N\)个节点的树&#xff0c;开始的时候你在\(1\)号节点。 除了\(1\)号节点以外&#xff0c;每个点都有访问次数限制\(t_i\)&#xff0c;即到达该点的次数上限。 除了\(1\)号点每个点还有一个权值\(w_i\)&#xff0c;这个权值可以…

linux安装python2和3版本_Windows下安装Python2和Python3双版本

现在大家常用的桌面操作系统有&#xff1a;Windows、Mac OS、Ubuntu&#xff0c;其中Mac OS 和 ubuntu上都会自带Python。这里我们只介绍下Windows(我用的Win10)环境下的python2.x 和 python3.x 的安装&#xff0c;以及python2.x 与 python3.x 共存时的配置问题。本节内容pytho…

JS+CSS点击弹出登陆框代码

<head><meta http-equiv"Content-Type" content"text/html; charsetgb2312"><title>弹出登录框的实现代码</title></head><body><style type"text/css">body {margin: 0px;padding:0}#div1 {display:…