gin使用自签名SSL证书与自签名证书不受信任方法解决

文章目录

    • 1. X.509 V3证书介绍
    • 2、使用openssl生成自签名证书和解决不受信任问题
      • 2.1、生成根证书
      • 2.2、为域名生成证书申请文件
      • 2.3、为域名创建证书的扩展描述文件
      • 2.4、为域名创建证书
    • 3、Go应用中使用自签名证书
      • 3.1、gin框架调用实现
      • 3.2、运行效果
    • 4、使用java的bouncycastle生成ssl证书

1. X.509 V3证书介绍

X.509 是公钥证书的格式标准, 广泛用于 TLS/SSL 安全通信或者其他需要认证的环境中。
X.509 证书可以由 CA(Certificate Authority,数字证书认证机构)颁发,也可以自签名产生。

*X.509 证书中主要含有公钥、身份信息、签名信息和有效性信息等信息,这些信息用于构建一个验证公钥的体系。

- 公钥 : 非对称密码中的公钥。公钥证书的目的就是为了在互联网上分发公钥。
- 身份信息 : 公钥对应的私钥持有者的信息,域名以及用途等。
- 签名信息 : 对公钥进行签名的信息,提供公钥的验证链。可以是 CA
- 的签名或者是自签名,不同之处在于CA证书的根证书大都内置于操作系统或者浏览器中,而自签名证书的公钥验证链则需要自己维护(手动导入到操作系统中或者再验证流程中单独提供自签名的根证书)。
- 有效性信息:证书的有效时间区间,以及 CRL(证书吊销列表)等相关信息。
- X.509 证书的标准规范RFC5280中详细描述了证书的 Encoding Format(编码格式)和Structure(证书结构)。

X.509 证书相关文件常见的扩展名

  • .pem : 隐私增强型电子邮件格式(缩写:PEM)格式,通常是由证书的 DER 二进制 Base64 编码得出。(最常用)。
  • .key : PEM 格式的私钥文件。
  • .pub : PEM 格式的公钥文件。
  • .crt : PEM 格式的公钥证书文件,也可能是 DER。
  • .cer : DER 格式的公钥证书文件,也可能是 PEM。
  • .crs : PEM 格式的 CSR 文件,也可能是 DER。
  • .p12 – PKCS#12 格式,包含证书的同时可能还包含私钥。
  • .pfx – PFX,PKCS#12 之前的格式(通常用PKCS#12格式,比如由互联网信息服务产生的 PFX 文件)。

2、使用openssl生成自签名证书和解决不受信任问题

openssl命令行工具用于从shell程序使用OpenSSL加密库的各种加密功能。 它可以用于:

创建和管理私钥,公钥和参数
公钥加密操作
创建X.509证书,CSR和CRL
消息摘要的计算
使用密码进行加密和解密
SSL / TLS客户端和服务器测试
处理S / MIME签名或加密的邮件
时间戳记请求,生成和验证

2.1、生成根证书

# 生成根证书CA.crt和根证书私钥CA.key
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -subj "/C=CN/ST=GD/L=GD/O=PenngoDev/CN=Create by penngo" -keyout CA.key -out CA.crt -reqexts v3_req -extensions v3_ca

2.2、为域名生成证书申请文件

# 创建证书的私钥
openssl genrsa -out penngo.test.key 2048
# 根据私钥创建一个证书申请文件private.csr,注意证书主体的描述使用-subj参数描述,CN必须和应用中请求的地址一致,可以是IP地址或域名
openssl req -new -key penngo.test.key -subj "/C=CN/ST=GD/L=GD/O=penngo_test/CN=www.penngo.test" -sha256 -out penngo.test.csr

2.3、为域名创建证书的扩展描述文件

根据证书申请文件创建证书的扩展描述文件,如果不使用扩展描述文件,那么在浏览器中无法授信,会提示证书无效。

#penngo.test.ext
[ req ]
default_bits        = 1024
distinguished_name  = req_distinguished_name
req_extensions      = ptest
extensions          = ptest
[ req_distinguished_name ]
countryName         = CN
stateOrProvinceName = Definesys
localityName        = Definesys
organizationName    = Definesys
[PTEST]
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = DNS:www.penngo.test

2.4、为域名创建证书

根据penngo.test.csr文件和penngo.test.ext、以及根证书CA.crt创建一个域名证书penngo.test.crt

openssl x509 -req -days 365 -in penngo.test.csr -CA CA.crt -CAkey CA.key -CAcreateserial -sha256 -out penngo.test.crt -extfile penngo.test.ext -extensions PTEST

最终生成的文件包括:

CA.crt  # 根证书
CA.key  # 根证书私钥
penngo.test.crt # 域名证书
penngo.test.key # 域名证书私钥

根证书中的主体描述可以随意填,但是域名证书中的主体的CN必须和请求地址中的IP或域名一致。

双击根证书CA.crt选择安装证书,注意在选择安装区域时,一定要选择“受信任的根证书颁发机构”。

3、Go应用中使用自签名证书

3.1、gin框架调用实现

package main
import ("github.com/gin-gonic/gin""html/template"
)
var html = template.Must(template.New("https").Parse(`
<html>
<head><title>Https Test</title><script src="/assets/app.js"></script>
</head>
<body><h1>Welcome, Test!</h1>
</body>
</html>
`))
func main() {r := gin.Default()r.Static("/assets", "./assets")r.SetHTMLTemplate(html)r.GET("/", func(c *gin.Context) {c.HTML(200, "https", gin.H{"status": "success",})})// 监听并在 https://127.0.0.1:8080 上启动服务r.RunTLS(":443", "./testdata/penngo.test.crt", "./testdata/penngo.test.key")
}

3.2、运行效果

在这里插入图片描述

4、使用java的bouncycastle生成ssl证书

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>com.penngo</groupId><artifactId>code_test</artifactId><version>1.0</version></parent><artifactId>tls_https</artifactId><properties><maven.compiler.source>11</maven.compiler.source><maven.compiler.target>11</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><!-- https://mvnrepository.com/artifact/org.bouncycastle/bcprov-ext-jdk18on --><dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-ext-jdk18on</artifactId><version>1.77</version></dependency><!-- https://mvnrepository.com/artifact/org.bouncycastle/bcpkix-jdk18on --><dependency><groupId>org.bouncycastle</groupId><artifactId>bcpkix-jdk18on</artifactId><version>1.77</version></dependency><!-- https://mvnrepository.com/artifact/commons-io/commons-io --><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.15.1</version></dependency></dependencies>
</project>

X509V3CreateExample.java

package com.penngo;import java.io.File;
import java.math.BigInteger;
import java.nio.charset.StandardCharsets;
import java.security.*;
import java.security.cert.X509Certificate;
import java.util.Base64;
import java.util.Date;
import org.apache.commons.io.FileUtils;
import org.bouncycastle.asn1.x500.X500Name;
import org.bouncycastle.asn1.x500.X500NameBuilder;
import org.bouncycastle.asn1.x500.style.BCStyle;
import org.bouncycastle.asn1.x509.*;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.x509.X509V3CertificateGenerator;/*** Basic X.509 V3 Certificate creation with TLS flagging.*/
public class X509V3CreateExample {static {try {Security.addProvider(new BouncyCastleProvider());} catch (Exception e) {e.printStackTrace();}}/*** 生成Subject信息** @param C  Country Name (国家代号),eg: CN* @param ST State or Province Name (洲或者省份)* @param L  Locality Name (城市名)* @param O  Organization Name (可以是公司名称)* @param OU Organizational Unit Name (可以是单位部门名称)* @param CN Common Name (服务器ip或者域名)* @return X500Name Subject*/public static X500Name generateSubject(String C, String ST, String L,String O, String OU, String CN) {X500NameBuilder x500NameBuilder = new X500NameBuilder();x500NameBuilder.addRDN(BCStyle.C, C);x500NameBuilder.addRDN(BCStyle.ST, ST);x500NameBuilder.addRDN(BCStyle.L, L);x500NameBuilder.addRDN(BCStyle.O, O);x500NameBuilder.addRDN(BCStyle.OU, OU);x500NameBuilder.addRDN(BCStyle.CN, CN);return x500NameBuilder.build();}public static X509Certificate generateV3Certificate(KeyPair pair)throws InvalidKeyException, NoSuchProviderException, SignatureException {// generate the certificateX509V3CertificateGenerator certGen = new X509V3CertificateGenerator();certGen.setSerialNumber(BigInteger.valueOf(System.currentTimeMillis()));certGen.setNotBefore(new Date(System.currentTimeMillis()));certGen.setNotAfter(new Date(System.currentTimeMillis() + (long)1000 * 3600 * 24 * 365));// 颁发对象X500Name subject2 = generateSubject("CN", "GuangDong", "GuangZhou", "博客:https://blog.csdn.net/penngo", "penngo", "www.penngo.test");certGen.setSubjectDN(X509Name.getInstance(subject2));// 颁发者X500Name subject = generateSubject("CN", "GuangDong", "GuangZhou", "DO_NOT_TRUST", "DO_NOT_TRUST", "Created by penngo");certGen.setIssuerDN(X509Name.getInstance(subject));certGen.setPublicKey(pair.getPublic());certGen.setSignatureAlgorithm("SHA256WithRSAEncryption");certGen.addExtension(X509Extensions.BasicConstraints, true, new BasicConstraints(false));certGen.addExtension(X509Extensions.KeyUsage, true, new KeyUsage(KeyUsage.digitalSignature | KeyUsage.keyEncipherment));certGen.addExtension(X509Extensions.ExtendedKeyUsage, true, new ExtendedKeyUsage(KeyPurposeId.id_kp_serverAuth));//        certGen.addExtension(X509Extensions.SubjectAlternativeName, false, new GeneralNames(new GeneralName(GeneralName.rfc822Name, "test@test.test")));return certGen.generateX509Certificate(pair.getPrivate(), "BC");}public static void main(String[] args)throws Exception {// create the keysKeyPair pair = Utils.generateRSAKeyPair();PrivateKey aPrivate = pair.getPrivate();//下面是私钥key生成的过程byte[] privateKeyEncode = aPrivate.getEncoded();String privateKeyStr = Base64.getEncoder().encodeToString(privateKeyEncode);String privateKeyFileContent = "" +"-----BEGIN RSA PRIVATE KEY-----\n" +lf(privateKeyStr, 64) +"-----END RSA PRIVATE KEY-----";FileUtils.write(new File("logs\\server2.key"), privateKeyFileContent,StandardCharsets.UTF_8);// generate the certificateX509Certificate cert = generateV3Certificate(pair);// show some basic validationcert.checkValidity(new Date());cert.verify(cert.getPublicKey());byte[] encoded = cert.getEncoded();String certStr = Base64.getEncoder().encodeToString(encoded);System.out.println("valid certificate generated" + certStr);String certFileContent = "" +"-----BEGIN CERTIFICATE-----\n" +lf(certStr, 64) +"-----END CERTIFICATE-----";FileUtils.write(new File("logs\\server2.pem"), certFileContent,StandardCharsets.UTF_8);}public static String lf(String str, int lineLength) {assert str != null;assert lineLength > 0;StringBuilder sb = new StringBuilder();char[] chars = str.toCharArray();int n = 0;for (char aChar : chars) {sb.append(aChar);n++;if (n == lineLength) {n = 0;sb.append("\n");}}if (n != 0)sb.append("\n");return sb.toString();}
}

官方参考自官方例子:https://www.bouncycastle.org/documentation.html
注意当前Java例子生成的证书,在浏览器中会显示不受信任的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/220920.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

比较好的python书籍,python有什么书推荐

大家好&#xff0c;小编来为大家解答以下问题&#xff0c;比较好的python书籍&#xff0c;python有什么书推荐&#xff0c;现在让我们一起来看看吧&#xff01; 我是在半年前接触到Python的&#xff0c;我之前没有一点编程基础&#xff0c;但在我自学的这半年里&#xff0c;我发…

Saas 中 用默认的值,不初始化给商户值,sql 查询 group by中,指定字段 倒序

在saas 项目中&#xff0c;有些商户没有设定某些值&#xff0c;则用系统默认的值&#xff0c;不需要初始化给商户 SELECT * FROM app_public_config WHERE (name, merchant_id) IN (SELECT name, MAX(merchant_id)FROM app_public_configGROUP BY name ) and merchant_id IN …

vue3 后台返回的接口数据,下载图片到本地

vue3 后台返回的接口数据&#xff0c;下载图片到本地 <el-table><el-table-column align"left" label"操作" min-width"240"><template #default"scope"><el-button icon"edit" type"primary&quo…

我的NPI项目之Android 安全系列 -- Android Strongbox 初识

从Android9(Pie)开始,Google强烈建议支持Strongbox. 具体描述如下: 一直到目前的Android14. 对应的内容也一并贴出来: 说人话就是Android开始通过独立于主SoC的单元进行密钥存储了。 通常&#xff0c;这样的单元就是我们通常称作的Secure Element&#xff08;SE&#xff09;&am…

高效备份与大数据分析:揭秘亚马逊云科技海外服务器强大能力

首先&#xff0c;让我们先来了解一下云计算的基本概念。云计算是一种基于互联网的计算模式&#xff0c;通过将计算资源、存储空间和应用程序提供给用户&#xff0c;实现按需使用和付费的方式。依托于众多出彩的海外服务器产品我们可以获得这一体验。云计算能够极大地简化用户的…

OpenCV-Python:DevCloud CodeLab介绍及学习

1.Opencv-Python演示环境 windows10 X64 企业版系统python 3.6.5 X64OpenCV-Python 3.4.2.16本地PyCharm IDE线上注册intel账号&#xff0c;使用DevCloud CodeLab 平台 2.DevCloud CodeLab是什么&#xff1f; DevCloud是一个基于云端的开发平台&#xff0c;提供了强大的计算…

UE5 C++(二)— 游戏架构介绍

架构关系如下&#xff1a; 这里只简单描述下&#xff0c;具体的查看官方文档 AGameMode: AGameMode 是 AGameModeBase 的子类&#xff0c;拥有一些额外的功能支持多人游戏和旧行为。 所有新建项目默认使用 AGameModeBase。 如果需要此额外行为&#xff0c;可切换到从 AGameM…

二、Java基础语法

day02 - Java基础语法 1. 注释 ​ 注释是对代码的解释和说明文字。 Java中的注释分为三种&#xff1a; 单行注释&#xff1a; // 这是单行注释文字多行注释&#xff1a; /* 这是多行注释文字 这是多行注释文字 这是多行注释文字 */ 注意&#xff1a;多行注释不能嵌套使用…

docker-harbor 私有仓库

docker 镜像 容器 仓库 仓库&#xff1a;保存镜像 私有&#xff0c;自定义用户的形式登录仓库&#xff0c;拉取或者上传镜像。&#xff08;内部隔离的用户&#xff09; harbor&#xff1a;是VMware公司开发的&#xff0c;开源的企业级的docker registry项目。 帮助用户快速…

【刷题笔记】N皇后||回溯||符合思维方式

N皇后II 1 题目详情 n 皇后问题 研究的是如何将 n 个皇后放置在 n n 的棋盘上&#xff0c;并且使皇后彼此之间不能相互攻击。 给你一个整数 n &#xff0c;返回 n 皇后问题 不同的解决方案的数量。 https://leetcode.cn/problems/n-queens-ii/ 2 分析 刚一开始的时候我认…

由@EnableWebMvc注解引发的Jackson解析异常

同事合了代码到开发分支&#xff0c;并没有涉及到改动的类却报错。错误信息如下&#xff1a; Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.http.conv…

【Python机器学习系列】一文讲透机器学习中的K折交叉验证(源码)

一、简介 前面我详细介绍了关于机器学习的归一化和反归一化以及表格数据在机器学习中的输入格式问题&#xff1a; 一文彻底搞懂机器学习中的归一化与反归一化问题 【Python机器学习系列】一文彻底搞懂机器学习中表格数据的输入形式&#xff08;理论源码&#xff09; 本文将介绍…

Mysql workbench

下载地址: https://download.csdn.net/download/a876106354/88616595

Numpy: 修改numpy的dtype

要修改NumPy数组的dtype&#xff0c;可以使用astype()方法。这个方法将创建一个新的数组&#xff0c;其数据类型&#xff08;dtype&#xff09;由参数指定。 下面是一个例子&#xff0c;展示如何将一个NumPy数组的dtype从int64修改为float32: import numpy as np# 创建一个in…

进程概念【linux】

进程基础 在学习进程之前&#xff0c;首先要有一定的计算机硬件和软件基础。 硬件基础&#xff1a;冯诺依曼体系结构 如图&#xff0c;是计算机在硬件上的体系结构。 下面举出一些常见的输入输出设备&#xff08;有些设备只作输出设备&#xff0c;或者只作输入设备&#xff…

LLM之Prompt(三)| XoT:使用强化学习和蒙特卡罗树搜索将外部知识注入Prompt中,性能超过CoT,ToT和GoT

​论文地址&#xff1a;https://arxiv.org/pdf/2311.04254.pdf 一、当前Prompt技术的局限性 LLM使用自然语言Prompt可以将复杂的问题分解为更易于管理的“thought”可以回复用户的问题。然而&#xff0c;大多数现有的Prompt技术都有局限性&#xff1a; 输入输出&#xff08;I…

【QT 5 调试软件+Linux下调用脚本shell-经验总结+初步调试+基础样例】

【QT 5 调试软件Linux下调用脚本shell-经验总结初步调试基础样例】 1、前言2、实验环境3、自我总结4、实验过程&#xff08;1&#xff09;准备工作-脚本1&#xff09;、准备工作-编写运行脚本文件2&#xff09;、给权限3&#xff09;、运行脚本 &#xff08;2&#xff09;进入q…

pytorch一致数据增强

分割任务对 image 做&#xff08;某些&#xff09;transform 时&#xff0c;要对 label&#xff08;segmentation mask&#xff09;也做对应的 transform&#xff0c;如 Resize、RandomRotation 等。如果对 image、label 分别用 transform 处理一遍&#xff0c;则涉及随机操作的…

计算机网络网络层(期末、考研)

计算机网络总复习链接&#x1f517; 目录 路由算法静态路由与动态路由距离-向量算法链路状态路由算法层次路由 IPv4&#xff08;这个必考&#xff09;IPv4分组IPv4地址与NAT子网划分与子网掩码、CIDRARP、DHCP与ICMP地址解析协议ARP动态主机配置协议DHCP IPv6IPv6特点 路由协议…

android studio 创建按钮项目

1&#xff09;、新建一个empty activity项目&#xff0c;切换到project视图&#xff1a; 2&#xff09;、修改app\src\main\res\layout\activity_main.xml文件&#xff0c;修改后如下&#xff1a; <?xml version"1.0" encoding"utf-8"?> <andr…