SSL双向认证证书制作过程流程
- 格式:doc
- 大小:960.00 KB
- 文档页数:17
ssl证书生成过程的算法
SSL证书生成过程涉及到公钥基础设施(PKI)和非对称加密算法。
一般来说,SSL证书的生成过程包括以下步骤:
1. 密钥对生成,首先,使用非对称加密算法(如RSA或ECC)生成一个密钥对,包括一个私钥和一个公钥。
私钥用于签署数据和解密信息,而公钥用于验证签名和加密信息。
2. 证书请求生成,接下来,使用生成的密钥对创建一个证书请求(CSR),其中包含了将被证书颁发机构(CA)验证的信息,如域名、组织信息等。
3. CA验证,证书请求被发送到CA进行验证。
CA会验证请求中的信息,确保请求者拥有对应的域名或组织,并且符合CA的要求。
4. 签署证书,一旦验证通过,CA会使用自己的私钥对证书请求中的公钥和信息进行签名,生成SSL证书。
5. 证书颁发,CA将签署后的证书返回给请求者,请求者可以将该证书安装到其服务器上,以启用SSL加密通信。
整个过程涉及到非对称加密算法的使用,特别是在证书请求生成和签署证书的过程中。
这些算法保证了私钥的安全性,同时也确保了证书的真实性和完整性。
1.文件夹建立新建一个文件夹如demoCA,进入demoCA,最好将cmd.exe拷贝到demoCA文件夹中,在demoCA目录下分别建立一个文件夹newcerts,一个文件index.txt,点击cmd.exe,敲入命令Echo 01 > serial 回车,然后将c:\openssl目录下的f拷贝到demoCA目录下,在DOS命令下,敲入edit f,将dir = /demoCA修改dir = ./即可2.生成CA证书openssl req -new -x509 -keyout ca.key -out ca.crt -days 3650 -config f说明(证书相关属性模板--下面的keytool生成要与这里相同):Countty Name: CNState or Province Name:shanghaiLocality Name:shanghaiOrganization Name:chinaumsOrganization Unit Name:developmemtCommon Name:chexEmail Address:chex227@3.生成server端证书:1)生成KeyPair生成密钥对keytool -genkey -alias server -keysize 1024 -validity 3650 -keyalg RSA -dname "CN=chex, OU=development,O=chinaums, L=shanghai, S=shanghai, C=CN" -keypass 123456 -storepass 123456 -keystore server.jks2)生成证书签名请求keytool -certreq -alias server -sigalg MD5withRSA -file server.csr -keypass 123456 -storepass 123456 -keystore server.jks3)用CA私钥进行签名,也可以到权威机构申请CA签名openssl ca -in server.csr -out server.crt -cert ca.crt -keyfile ca.key -config f4)导入信任的CA根证书到keystorekeytool -import -v -trustcacerts -alias ca_root -file ca.crt -storepass 123456 -keystore server.jks 5.1)5)把CA签名后的server端证书导入keystore格式化server.crt,否则用keytool import的时候会出现error:invalid DER-encoded certificate dataopenssl x509 -in server.crt -out server.der -outform DERkeytool -import -v -alias server -file server.der -keypass 123456 -storepass 123456 -keystore server.jksJava版client4.生成Client证书1)生成KeyPair生成密钥对keytool -genkey -alias client -keysize 1024 -validity 3650 -keyalg RSA -dname "CN=client, OU=development,O=chinaums, L=shanghai, S=shanghai, C=CN" -keypass 123456 -storepass 123456 -keystore client.jks2)生成证书签名请求keytool -certreq -alias client -sigalg MD5withRSA -file client.csr -keypass 123456 -storepass 123456 -keystore client.jks3)用CA私钥进行签名,也可以到权威机构申请CA签名openssl ca -in client.csr -out client.crt -cert ca.crt -keyfile ca.key -config f4)导入信任的CA根证书到keystorekeytool -import -v -trustcacerts -alias ca_root -file ca.crt -storepass 123456 -keystore client.jks5)把CA签名后的server端证书导入keystore格式化server.crt,否则用keytool import的时候会出现error:invalid DER-encoded certificate dataopenssl x509 -in client.crt -out client.der -outform DERkeytool -import -v -alias client -file client.der -keypass 123456 -storepass 123456 -keystore client.jksC++版client1.生成客户端私钥文件Openssl >genrsa -out clt.key 10242.想自定义CA提交签名申请Openssl >req -new -key clt.key -out clt.csr -config f个人设置同server端3.用自定义CA签名客户端Openssl > ca -in clt.csr -out clt.crt -cert ca.crt -keyfile ca.key -config f然后将clt.key,ca.crt,clt.crt复制到C:\gmc目录即可。
双向证书认证流程双向证书认证,听起来是不是有点高大上呢?其实呀,它就是一种互相验证证书的过程啦。
那这个流程是怎么一回事呢?这就来给你唠唠。
一、什么是双向证书认证。
简单来说,双向证书认证就像是两个人见面互相查看身份证一样。
在网络的世界里,不同的主体(比如说服务器和客户端)都有自己的“身份证”,也就是证书。
这个证书包含了很多关于这个主体的信息,像是它是谁,从哪里来之类的。
而双向证书认证呢,就是双方都要把自己的证书拿出来给对方看,互相确认身份的这么一个过程。
这样做的好处可多啦,可以保证双方通信的安全性,防止那些不怀好意的家伙混进来捣乱呢。
二、准备工作。
1. 证书的获取。
不管是服务器还是客户端,都得先有自己的证书才行。
这证书就像是你在网络世界里的通行证。
一般来说,这个证书是要从专门的证书颁发机构(CA)那里获取的。
这个CA就像是一个非常严格的警察叔叔,他会仔细审查你(这里就是申请证书的主体啦)的身份信息,确定你是合法的之后,才会给你颁发证书。
比如说,你是一家公司,想要一个证书来保证你的服务器和客户之间的安全通信,那你就得向CA提交公司的相关信息,像营业执照啦,法人信息啦等等,经过一系列的审核,才能拿到证书。
2. 配置环境。
有了证书还不够呢,还得把相关的环境配置好。
这就像是你拿到了身份证,还得把身份证放在一个合适的地方,方便拿出来给别人看一样。
对于服务器来说,要在服务器的配置文件里设置好证书的相关参数,告诉服务器这个证书在哪里,怎么用。
客户端也是类似的,要在客户端的软件或者设备里做好相应的配置,让它知道怎么找到自己的证书,并且在需要的时候把证书展示出来。
三、认证过程。
1. 发起请求。
一般是客户端先发起请求啦。
就好比你去一个高档的俱乐部,你得先走到门口跟保安说你要进去一样。
客户端会向服务器发送一个请求,这个请求里面就包含了一些信息,比如说我想要访问你这个服务器,我是谁之类的。
但是这时候服务器还不能轻易相信客户端呀,毕竟谁知道这个请求是不是坏人发出来的呢。
HTTPS双向认证详细解说双向认证这⾥总结为详细的步骤①浏览器发送⼀个连接请求给安全服务器。
②服务器将⾃⼰的证书,以及同证书相关的信息发送给客户浏览器。
③客户浏览器检查服务器送过来的证书是否是由⾃⼰信赖的 CA 中⼼所签发的。
如果是,就继续执⾏协议;如果不是,客户浏览器就给客户⼀个警告消息:警告客户这个证书不是可以信赖的,询问客户是否需要继续。
④接着客户浏览器⽐较证书⾥的消息,例如域名和公钥,与服务器刚刚发送的相关消息是否⼀致,如果是⼀致的,客户浏览器认可这个服务器的合法⾝份。
⑤服务器要求客户发送客户⾃⼰的证书。
收到后,服务器验证客户的证书,如果没有通过验证,拒绝连接;如果通过验证,服务器获得⽤户的公钥。
⑥客户浏览器告诉服务器⾃⼰所能够⽀持的通讯对称密码⽅案。
⑦服务器从客户发送过来的密码⽅案中,选择⼀种加密程度最⾼的密码⽅案,⽤客户的公钥加过密后通知浏览器。
⑧浏览器针对这个密码⽅案,选择⼀个通话密钥,接着⽤服务器的公钥加过密后发送给服务器。
⑨服务器接收到浏览器送过来的消息,⽤⾃⼰的私钥解密,获得通话密钥。
⑩服务器、浏览器接下来的通讯都是⽤对称密码⽅案,对称密钥是加过密的。
单向认证 SSL 协议的具体过程①客户端的浏览器向服务器传送客户端 SSL 协议的版本号,加密算法的种类,产⽣的随机数,以及其他服务器和客户端之间通讯所需要的各种信息。
②服务器向客户端传送 SSL 协议的版本号,加密算法的种类,随机数以及其他相关信息,同时服务器还将向客户端传送⾃⼰的证书。
③客户利⽤服务器传过来的信息验证服务器的合法性,服务器的合法性包括:证书是否过期,发⾏服务器证书的 CA 是否可靠,发⾏者证书的公钥能否正确解开服务器证书的“发⾏者的数字签名”,服务器证书上的域名是否和服务器的实际域名相匹配。
如果合法性验证没有通过,通讯将断开;如果合法性验证通过,将继续进⾏第四步。
④⽤户端随机产⽣⼀个⽤于后⾯通讯的“对称密码”,然后⽤服务器的公钥(服务器的公钥从步骤②中的服务器的证书中获得)对其加密,然后将加密后的“预主密码”传给服务器。
生成SSL证书方法介绍SSL证书(Secure Sockets Layer Certificate)是一种用于确保安全网络通信的数字证书。
在互联网上进行数据交换时,SSL证书可以保护网站的隐私与安全。
本文将介绍SSL证书的基本概念、生成过程以及一些常见的SSL证书生成方法。
一、SSL证书概述SSL证书是通过SSL协议对网站进行加密和身份认证的一种方式。
它是由数字签名认证中心(CA,Certificate Authority)签发并包含了网站的身份信息。
SSL证书的主要作用如下: 1. 数据加密:SSL证书可以确保网站和用户之间的数据传输过程中是加密的,防止第三方窃听和篡改。
2. 身份认证:SSL证书可以验证网站的真实身份,确保用户访问的是合法的网站,避免遭受钓鱼网站的攻击。
3. 提高信任度:通过使用SSL证书,网站可以获得浏览器的安全标识,如绿锁图标,增加用户对网站的信任度。
二、SSL证书的生成过程SSL证书的生成过程通常由以下几个步骤组成:1. 生成私钥首先,需要生成一个用于加密和解密数据的私钥。
私钥是非对称加密算法中的一种关键。
2. 生成证书签发请求(CSR)CSR是用于向数字签名认证中心申请签发SSL证书的文件。
CSR包含了一些关键的信息,如网站的域名、组织名称等。
生成CSR的过程需要使用私钥和一些其他信息。
CSR通常是在服务器上生成的,可以使用各种不同的工具和命令完成这个过程。
3. 提交CSR到CA生成CSR之后,需要将CSR文件提交到一个数字签名认证中心(CA)。
CA进行身份验证,并使用CA的私钥对CSR进行签名,生成一个SSL证书。
4. 安装SSL证书获取到SSL证书后,需要将其安装在服务器上。
安装过程可能因服务器的不同而有所差异,但通常涉及将证书文件和私钥文件配置到服务器的SSL证书配置中。
三、SSL证书的生成方法以下是一些常见的SSL证书生成方法:1. 使用命令行工具生成SSL证书命令行工具是生成SSL证书的一种非常常见的方法。
ssl证书认证流程SSL证书是一种数字证书,用于确保网站和用户之间的数据传输的安全性。
它通过对网站身份进行验证,加密数据传输,保护用户的敏感信息免受黑客和恶意攻击。
以下是SSL证书认证的基本流程:1. 申请证书:网站管理员首先需要选择一个可信任的证书颁发机构(CA)进行SSL证书申请。
CA是第三方机构,负责验证和确认网站身份的合法性。
通常,CA会提供多种证书类型,管理员可以根据自己的需求选择适合的证书。
2. 提供身份证明:在申请SSL证书时,管理员需要提交一些必要的身份信息来证明网站的合法性。
这些信息可能包括公司注册文件、域名所有权证明、联系信息等。
CA会对这些信息进行审查,并确保申请者具备使用该域名的权限。
3. 完成验证过程:验证过程是确保网站合法性的重要环节。
CA会与管理员联系,并要求提供一些额外的文件或通过特定的审核流程确认网站的所有权。
这可能包括通过电子邮件发送验证代码到管理员的注册邮箱,或将CA的授权文件添加到网站的根目录。
4. 生成证书:一旦身份验证通过,CA将会生成一个数字证书,并使用自己的数字签名来证明该证书的合法性。
数字证书中包含了网站的公钥和相关信息。
CA会将证书发送给管理员,管理员需要将其安装到网站的服务器上。
5. 配置服务器:一旦证书安装完毕,管理员需要对网站的服务器进行相应的配置,以使其与SSL证书配合工作。
这可能涉及到启用SSL协议、加密传输等细节设置。
配置完成后,网站将可以通过HTTPS协议提供安全的数据传输。
6. 更新证书:SSL证书的有效期通常为一年或更长时间,过期后需要进行更新。
在证书到期前,管理员需要与CA联系并重新申请证书,并按照上述步骤重新进行验证和安装。
通过SSL证书认证流程,网站可以获得一个可信的标识,让用户放心地与其进行交互和传输敏感信息。
同时,网站管理员也应定期检查证书的有效期,并及时进行更新和维护,以保证网站的安全性和可靠性。
实现技术:JSSE(Java Security Socket Extension)是Sun为了解决在Internet上的实现安全信息传输的解决方案。
它实现了SSL和TSL(传输层安全)协议。
在JSSE中包含了数据加密,服务器验证,消息完整性和客户端验证等技术。
通过使用JSSE,可以在Client和Server之间通过TCP/IP协议安全地传输数据。
为了实现消息认证。
Server需要:1)KeyStore: 其中保存服务端的私钥2)Trust KeyStore:其中保存客户端的授权证书Client需要:1)KeyStore:其中保存客户端的私钥2)Trust KeyStore:其中保存服务端的授权证书使用Java自带的keytool命令,去生成这样信息文件:1)生成服务端私钥,并且导入到服务端KeyStore文件中2)根据私钥,导出服务端证书3)将服务端证书,导入到客户端的Trust KeyStore中采用同样的方法,生成客户端的私钥,客户端的证书,并且导入到服务端的Trust KeyStore中1)keytool -genkey -alias clientkey -keystore kclient.keystore2)keytool -export -alias clientkey -keystore kclient.keystore -file client.crt3)keytool -import -alias clientkey -file client.crt -keystore tserver.keystoreServerJava代码package ssl;import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.FileInputStream;import java.io.InputStream;import java.io.OutputStream;import .Socket;import java.security.KeyStore;import .ssl.KeyManagerFactory;import .ssl.SSLContext;import .ssl.SSLServerSocket;import .ssl.TrustManagerFactory;/**** @author Leo*/public class Server implements Runnable{private static final int DEFAULT_PORT = 7777;private static final String SERVER_KEY_STORE_PASSWORD = "123456";private static final String SERVER_TRUST_KEY_STORE_PASSWORD = "123456"; private SSLServerSocket serverSocket;/*** 启动程序** @param args*/public static void main(String[] args) {Server server = new Server();server.init();Thread thread = new Thread(server);thread.start();}public synchronized void start() {if (serverSocket == null) {System.out.println("ERROR");return;}while (true) {try {Socket s = serverSocket.accept();InputStream input = s.getInputStream();OutputStream output = s.getOutputStream();BufferedInputStream bis = new BufferedInputStream(input);BufferedOutputStream bos = new BufferedOutputStream(output);byte[] buffer = new byte[20];bis.read(buffer);System.out.println("------receive:--------"+new String(buffer).toString());bos.write("yes".getBytes());bos.flush();s.close();} catch (Exception e) {System.out.println(e);}}}public void init() {try {SSLContext ctx = SSLContext.getInstance("SSL");KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");KeyStore ks = KeyStore.getInstance("JKS");KeyStore tks = KeyStore.getInstance("JKS");ks.load(new FileInputStream("src/ssl/kserver.keystore"), SERVER_KEY_STORE_PASSWORD.t oCharArray());tks.load(new FileInputStream("src/ssl/tserver.keystore"), SERVER_TRUST_KEY_STORE_PAS SWORD.toCharArray());kmf.init(ks, SERVER_KEY_STORE_PASSWORD.toCharArray());tmf.init(tks);ctx.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);serverSocket = (SSLServerSocket) ctx.getServerSocketFactory().createServerSocket(DEFAULT _PORT);serverSocket.setNeedClientAuth(true);} catch (Exception e) {System.out.println(e);}}public void run() {// TODO Auto-generated method stubstart();}}package ssl;import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.FileInputStream;import java.io.InputStream;import java.io.OutputStream;import .Socket;import java.security.KeyStore;import .ssl.KeyManagerFactory;import .ssl.SSLContext;import .ssl.SSLServerSocket;import .ssl.TrustManagerFactory;/**** @author Leo*/public class Server implements Runnable{private static final int DEFAULT_PORT = 7777;private static final String SERVER_KEY_STORE_PASSWORD = "123456";private static final String SERVER_TRUST_KEY_STORE_PASSWORD = "123456";private SSLServerSocket serverSocket;/*** 启动程序** @param args*/public static void main(String[] args) {Server server = new Server();server.init();Thread thread = new Thread(server);thread.start();}public synchronized void start() {if (serverSocket == null) {System.out.println("ERROR");return;}while (true) {try {Socket s = serverSocket.accept();InputStream input = s.getInputStream();OutputStream output = s.getOutputStream();BufferedInputStream bis = new BufferedInputStream(input);BufferedOutputStream bos = new BufferedOutputStream(output);byte[] buffer = new byte[20];bis.read(buffer);System.out.println("------receive:--------"+new String(buffer).toString());bos.write("yes".getBytes());bos.flush();s.close();} catch (Exception e) {System.out.println(e);}}}public void init() {try {SSLContext ctx = SSLContext.getInstance("SSL");KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");KeyStore ks = KeyStore.getInstance("JKS");KeyStore tks = KeyStore.getInstance("JKS");ks.load(new FileInputStream("src/ssl/kserver.keys tore"), SERVER_KEY_STORE_PASSWORD.toCharArray());tks.load(new FileInputStream("src/ssl/tserver.keystore"), SERVER_TRUST_KEY_STORE_PASSWORD.toCharArray());kmf.init(ks, SERVER_KEY_STORE_PASSWORD.toCharArray());tmf.init(tks);ctx.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);serverSocket = (SSLServerSocket) ctx.getServerSocketFactory().createServerSocket(DEFAULT_PORT);serverSocket.setNeedClientAuth(true);} catch (Exception e) {System.out.println(e);}}public void run() {// TODO Auto-generated method stubstart();}}Client:Java代码package ssl;import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.security.KeyStore;import .ssl.KeyManagerFactory;import .ssl.SSLContext;import .ssl.SSLSocket;import .ssl.TrustManagerFactory;/*** SSL Client** @author Leo*/public class Client {private static final String DEFAULT_HOST = "127.0.0.1";private static final int DEFAULT_PORT = 7777;private static final String CLIENT_KEY_STORE_PASSWORD = "123456";private static final String CLIENT_TRUST_KEY_STORE_PASSWORD = "123456"; private SSLSocket sslSocket;/*** 启动客户端程序** @param args*/public static void main(String[] args) {Client client = new Client();client.init();client.process();}public void process() {if (sslSocket == null) {System.out.println("ERROR");return;}try {InputStream input = sslSocket.getInputStream();OutputStream output = sslSocket.getOutputStream();BufferedInputStream bis = new BufferedInputStream(input);BufferedOutputStream bos = new BufferedOutputStream(output);bos.write("1234567890".getBytes());bos.flush();byte[] buffer = new byte[20];bis.read(buffer);System.out.println(new String(buffer));sslSocket.close();} catch (IOException e) {System.out.println(e);}}public void init() {try {SSLContext ctx = SSLContext.getInstance("SSL");KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");KeyStore ks = KeyStore.getInstance("JKS");KeyStore tks = KeyStore.getInstance("JKS");ks.load(new FileInputStream("src/ssl/kclient.keystore"), CLIENT_KEY_STORE_PASSWORD.to CharArray());tks.load(new FileInputStream("src/ssl/tclient.keystore"), CLIENT_TRUST_KEY_STORE_PASS WORD.toCharArray());kmf.init(ks, CLIENT_KEY_STORE_PASSWORD.toCharArray());tmf.init(tks);ctx.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);sslSocket = (SSLSocket) ctx.getSocketFactory().createSocket(DEFAULT_HOST, DEFAULT_PO RT);} catch (Exception e) {System.out.println(e);}}}package ssl;import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.security.KeyStore;import .ssl.KeyManagerFactory;import .ssl.SSLContext;import .ssl.SSLSocket;import .ssl.TrustManagerFactory;/*** SSL Client** @author Leo*/public class Client {private static final String DEFAULT_HOST = "127.0.0.1";private static final int DEFAULT_PORT = 7777;private static final String CLIENT_KEY_STORE_PASSWORD = "123456";private static final String CLIENT_TRUST_KEY_STORE_PASSWORD = "123456";private SSLSocket sslSocket;/*** 启动客户端程序** @param args*/public static void main(String[] args) {Client client = new Client();client.init();client.process();public void process() {if (sslSocket == null) {System.out.println("ERROR");return;}try {InputStream input = sslSocket.getInputStream();OutputStream output = sslSocket.getOutputStream();BufferedInputStream bis = new BufferedInputStream(input);BufferedOutputStream bos = new BufferedOutputStream(output);bos.write("1234567890".getBytes());bos.flush();byte[] buffer = new byte[20];bis.read(buffer);System.out.println(new String(buffer));sslSocket.close();} catch (IOException e) {System.out.println(e);}}public void init() {try {SSLContext ctx = SSLContext.getInstance("SSL");KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");KeyStore ks = KeyStore.getInstance("JKS");KeyStore tks = KeyStore.getInstance("JKS");ks.load(new FileInputStream("src/ssl/kclient.keystore"), CLIENT_KEY_STORE_PASSWORD.toCharArray());tks.load(new FileInputStream("src/ssl/tclient.keystore"), CLIENT_TRUST_KEY_STORE_PASSWORD.toCharArray());kmf.init(ks, CLIENT_KEY_STORE_PASSWORD.toCharArray());tmf.init(tks);ctx.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);sslSocket = (SSLSocket) ctx.getSocketFactory().createSocket(DEFAULT_HOST, DEFAULT_PORT);} catch (Exception e) {System.out.println(e);}}}启动Server启动Client,发送信息。
SSL双向认证(⾼清版)介绍了SSL双向认证的⼀些基本问题,以及使⽤Nginx+PHP基于它搭建https的Webservice。
之前的⽅式只是实现1:1的模式,昨天同事继续实现了n:1的模式,这⾥我再整理记录下。
由于nginx的ssl_client_certificate参数只能指定⼀个客户端公钥,如果增加⼀个客户端进⾏通信就要重新配⼀个server。
n:1的模式是通过CA的级联证书模式实现的,⾸先⾃⼰⽣成⼀套CA根级证书,再借助其⽣成⼆级证书作为client证书。
此时client私钥签名不仅可以通过对应的client公钥验证,还可通过根证书的公钥进⾏验证。
看到这⾥应该豁然开朗了吧,下⾯简单介绍下具体怎么操作:1 准备⼯作1.1 openssl⽬录准备⼀般情况下openssl的配置⽂件都在这个⽬录/etc/pki/tls,so:mkdir /etc/pki/ca_linvocd /etc/pki/ca_linvomkdir root server client newcertsecho 01 > serialecho 01 > crlnumbertouch index.txt1.2 openssl配置准备修改openssl配置vi /etc/pki/tls/f找到这句注释掉,替换为下⾯那句#default_ca = CA_defaultdefault_ca = CA_linvo把整个部分拷贝⼀份,改成上⾯的名字[ CA_linvo ]修改⾥⾯的如下参数:dir = /etc/pki/ca_linvocertificate = $dir/root/ca.crtprivate_key = $dir/root/ca.key保存退出2 创建CA根级证书⽣成key:openssl genrsa -out /etc/pki/ca_linvo/root/ca.key⽣成csr:openssl req -new -key /etc/pki/ca_linvo/root/ca.key -out /etc/pki/ca_linvo/root/ca.csr⽣成crt:openssl x509 -req -days 3650 -in /etc/pki/ca_linvo/root/ca.csr -signkey /etc/pki/ca_linvo/root/ca.key -out /etc/pki/ca_linvo/root/ca.crt ⽣成crl:openssl ca -gencrl -out /etc/pki/ca_linvo/root/ca.crl -crldays 7⽣成的根级证书⽂件都在/etc/pki/ca_linvo/root/⽬录下注意:创建证书时,建议证书密码设置长度>=6位,因为java的keytool⼯具貌似对它有要求。
SSL证书生成及配置方法如下:
获取证书:可以通过购买或免费获取证书。
在某些网站上可以免费申请到一些证书,如Let's Encrypt,这些证书可以提供基本的SSL加密功能。
如果需要更高级别的证书,可能需要购买。
安装证书:安装证书的过程通常包括以下几个步骤:
获取证书文件和私钥文件,这两个文件通常由证书颁发机构(CA)提供。
将证书文件上传到服务器上,并确保服务器能够访问到该文件。
在服务器上配置SSL证书,这通常涉及到编辑服务器的配置文件,如Nginx 或Apache的配置文件。
在配置文件中指定SSL证书的位置和私钥的位置,并启用SSL加密。
保存配置文件并重新启动服务器,使配置生效。
验证和测试:在配置SSL证书后,应该进行验证和测试,以确保SSL证书已经正确安装并且能够提供有效的SSL加密。
可以通过使用浏览器或其他工具来测试SSL证书是否有效。
需要注意的是,SSL证书的生成和配置涉及到网络安全和数据隐私等方面的问题,需要谨慎处理。
建议在进行相关操作前,了解相关的安全标准和最佳实践,并寻求专业人士的帮助和建议。
SSL单向认证和双向认证交互流程1.SSL单向认证:- 客户端发起握手请求,向服务器发送一个Client Hello消息,包含有关支持的加密算法和协议版本的信息。
- 服务器收到Client Hello消息后,向客户端发送一个ServerHello消息,包含选择的加密算法和协议版本。
-服务器将生成一个数字证书,其中包含服务器的公钥和其他相关信息,并将其发送给客户端。
-客户端使用预装的根证书颁发机构(CA)的公钥验证服务器证书的有效性。
如果验证成功,客户端随机生成一个对称密钥,使用服务器的公钥进行加密,并将其发送给服务器。
-服务器使用私钥解密客户端发送的对称密钥,并将其用作会话密钥。
同时,服务器生成一个数字证书和与会话相关的其他信息,并将其返回给客户端。
-客户端使用会话密钥加密握手过程中的后续通信。
2.SSL双向认证:- 客户端发起握手请求,向服务器发送一个Client Hello消息,包含有关支持的加密算法和协议版本的信息。
- 服务器收到Client Hello消息后,向客户端发送一个ServerHello消息,包含选择的加密算法和协议版本。
同时,服务器生成一个数字证书,其中包含服务器的公钥和其他相关信息,并将其发送给客户端。
-客户端使用预装的根证书颁发机构(CA)的公钥验证服务器证书的有效性。
如果验证成功,客户端将向服务器发送一个已经验证的客户端证书。
-服务器验证客户端证书的有效性,如果验证成功,服务器使用客户端的公钥加密随机生成的会话密钥,并将其发送给客户端。
-客户端使用私钥解密服务器发送的会话密钥,并将其用作会话密钥。
-双向认证的SSL会话将使用会话密钥进行后续通信。
总结:单向认证中,只有服务器需要提供证书来验证其身份,而双向认证中,不仅服务器需要提供证书,客户端也需要提供证书来验证其身份。
单向认证可以确保服务器的身份,双向认证可以确保服务器和客户端的身份。
需要注意的是,以上描述的交互流程是一个简化版本,实际的SSL/TLS握手过程可能涉及更多的消息交换和协商步骤,以确保通信的完整性、安全性和可靠性。
SSL双向认证证书制作流程
——含单向SSL
一、证书制作:
1
keytool -genkey -alias server -keyalg RSA -keysize 2048 -validity 3650 -dname
"CN=localhost,OU=DTY,O=BMC,L=Beijing,ST=Beijing,C=CN" -keypass 123456 -keystore server.jks -storepass 123456
CN:要签名的[域名]或[IP](说明:此处为要配置SSL服务器IP或域名)
OU:组织单位名称,如:[公司注册简称]
O:组织名称,如:[公司英文全称]
L:城市或地区名称,如:[Beijing]
ST:州或省份名称,如:[Beijing]
C:单位的两字母国家代码,如:[CN]
2
keytool -list -v -keystore server.jks -storepass 123456
3
keytool -selfcert -alias server -keystore server.jks -storepass 123456
4、验证生成的服务器密钥(库):
keytool -list -v -keystore server.jks -storepass 123456
5
keytool -export -alias server -keystore server.jks -file server.cer -storepass 123456
说明:此证书为后续要导入到浏览器中的受信任的根证书颁发机构。
6
说明:keytool –genkey命令默认生成的是keystore文件,但为了能顺利导入到IE或其他浏览器中,文件格式应为PKCS12。
稍后,此P12文件将导入到IE或其他浏览器中。
keytool -genkey -alias client -keyalg RSA -keysize 2048 -validity 3650 -dname
"CN=localhost,OU=DTY,O=BMC,L=Beijing,ST=Beijing,C=CN" -storetype PKCS12 -keypass 123456 -keystore client.p12 -storepass 123456
CN:要签名的[域名]或[IP](特别说明:这里是客户端机构的域名或IP)
OU:组织单位名称,如:[公司注册简称]
O:组织名称,如:[公司英文全称]
L:城市或地区名称,如:[Beijing]
ST:州或省份名称,如:[Beijing]
C:单位的两字母国家代码,如:[CN]
7
只有客户端密钥库文件还不行,还需要一个证书文件。
毕竟证书文件才是直接提供给外界的公钥凭证,因此需要将客户端密钥库文件中的公钥导入到某个证书文件中。
keytool -export -alias client -keystore client.p12 -storetype PKCS12 -rfc -file client.cer -storepass 123456
8
keytool -import -v -file client.cer -keystore server.jks -storepass 123456
9
keytool -list -v -keystore server.jks -storepass 123456
说明:验证步骤8的公钥是否导出成功。
二、证书导入:
1、导入客户端密钥(库):
a)对于IE浏览器,选择Internet选项,则显示如下:
b)点击证书按钮,显示如下:
c)
d)
注意:选择文件时,必须确认文件格式为:
e)
123456:
f)
g)
2、导入服务器密钥(库)受信任的根证书:
a)对于IE浏览器,选择Internet选项,则显示如下:
b)点击证书按钮,显示如下:。