当前位置: 首页 > news >正文

将SM2根证书预置到chromium中

最近花了很多精力在做chromium的GmSSL适配,协议和算法都已经完成,这篇文章是关于将SM2根证书预置到chromium中

我的开发测试环境是macos12.4,从chromium的代码和文档中得知证书获取和校验都是通过操作系统以及native api接口完成,如果需要国密证书验证和校验成功,需要对chromium做适配和开发,分为2步骤走:

1、chromium内置根证书

2、chromium调整验证流程

一、前提

1、在开始之前,您需要对开源项目chromium以及密码算法、安全通讯协议有一定的了解

2、你已经完成BoringSSL的密码算法、安全通讯协议的适配

二、国密根证书内置

1、下载根证书

这里我使用的是沃通和中国金融根证书

沃通

沃通SM2中级根证书-沃通WoTrus SSL证书!沃通CA SM2顶级根证书已经签发了如下中级根证书,用于颁发各种认证级别的SSL证书、客户端证书和时间戳证书。https://www.wotrus.com/root/SM2_intermediateca.htm

下载国密SM2根证书即可

 

中国金融

CPS_数字证书服务协议_证书体验平台_证书下载平台_证书链下载_申请表下载_全球服务器证书_相关下载_中国金融认证中心中国金融认证中心(CFCA)为客户提供专业的CPS、证书体验、证书下载、证书链下载、申请表下载、全球服务器证书、反欺诈全球服务器证书、证书服务协议、证书安全提示等方面综合、全面、立体的资料下载服务。https://www.cfca.com.cn/zhengshuzizhu/

在下载专区中下载生成证书链SM2

 

2、将证书转成pem格式

openssl x509 -in WoTrus-SM2.crt -out WoTrus-SM2.pem
openssl x509 -in CFCA_CS_SM2_CA.cer -out CFCA_CS_SM2_CA.pem

3、获取指纹签名的sha256值

openssl x509 -fingerprint -sha256 -in WoTrus-SM2.pem
sha256 Fingerprint=B2:CF:D0:68:B4:D7:FC:A1:21:07:AF:41:65:CC:DA:61:34:38:DD:BD:90:16:9F:5F:4B:11:1C:AF:A2:21:D4:35

去掉多余的信息得到值:B2CFD068B4D7FCA12107AF4165CCDA613438DDBD90169F5F4B111CAFA221D435

将WoTrus-SM2.pem改名为B2CFD068B4D7FCA12107AF4165CCDA613438DDBD90169F5F4B111CAFA221D435.pem

openssl x509 -fingerprint -sha256 -in CFCA_CS_SM2_CA.pem
sha256 Fingerprint=5F:C0:9A:7D:B2:B9:1E:87:6C:BE:A8:70:60:A9:FE:DF:02:91:69:81:50:97:78:53:BC:4B:5A:A6:54:98:9F:BD

去掉多余的信息得到值:5FC09A7DB2B91E876CBEA87060A9FEDF0291698150977853BC4B5AA654989FBD

将CFCA_CS_SM2_CA.pem改名为B2CFD068B4D7FCA12107AF4165CCDA613438DDBD90169F5F4B111CAFA221D435.pem

三、chromium代码调整

主要调整的代码部分是net网络模块, 主要加上 chrome_root_store_supported支持

1、net/features.gni

chrome_root_store_supported默认只支持windows,调整下支持macos, 将

chrome_root_store_supported = is_win

改为

chrome_root_store_supported = is_win || is_mac

2、将pem文件放入指定位置

将B2CFD068B4D7FCA12107AF4165CCDA613438DDBD90169F5F4B111CAFA221D435.pem、B2CFD068B4D7FCA12107AF4165CCDA613438DDBD90169F5F4B111CAFA221D435.pem放到net/data/ssl/chrome_root_store/store/certs下

3、修改net/data/ssl/chrome_root_store/store/root_store.textproto文件

路径就是刚才放置的路径

# Network WoTrus-SM2
trust_anchors {filename: "B2CFD068B4D7FCA12107AF4165CCDA613438DDBD90169F5F4B111CAFA221D435.pem"
}# Network CFCA_CS_SM2_CA
trust_anchors {filename: "5FC09A7DB2B91E876CBEA87060A9FEDF0291698150977853BC4B5AA654989FBD.pem"
}

4、修gn工程文件net/data/ssl/chrome_root_store/BUILD.gn文件

将pem文件添加到build.gn中,编译后会生成chrome-root-store-inc.cc中间文件

# Generate C++ include file for the Chrome root store.
compiled_action("gen_root_store_inc") {tool = "//net/tools/root_store_tool:root_store_tool"# It'd be really nice to list an input as "store/certs/*", but it doesn't seem# to work. So we list them all out.inputs = ["store/root_store.textproto","store/certs/02ed0eb28c14da45165c566791700d6451d7fb56f0b2ab1d3b8eb070e56edff5.pem","store/certs/0376ab1d54c5f9803ce4b2e201a0ee7eef7b57b636e8a93c9b8d4860c96f5fa7.pem",…."store/certs/fd73dad31c644ff1b43bef0ccdda96710b9cd9875eca7e31707af3e96d522bbd.pem","store/certs/B2CFD068B4D7FCA12107AF4165CCDA613438DDBD90169F5F4B111CAFA221D435.pem","store/certs/5FC09A7DB2B91E876CBEA87060A9FEDF0291698150977853BC4B5AA654989FBD.pem",]outputs = [ "${target_gen_dir}/chrome-root-store-inc.cc" ]args = ["--root-store-dir=" + rebase_path("store", root_build_dir),"--write-cpp=" + rebase_path("${target_gen_dir}/chrome-root-store-inc.cc",root_build_dir),]
}

自此静态证书部分添加完毕

下面对代码修改,以支持证书链的校验

5、调整证书信任存储代码

1) net/cert/internal/system_trust_store.cc

默认MACOS只支持从操作系统中获取证书并校验,这里改成浏览器内部预置证书校验

找到MACOS支持部分

修改下面代码

std::unique_ptr<SystemTrustStore> CreateSslSystemTrustStoreChromeRoot() {return std::make_unique<DummySystemTrustStore>();
}

#if BUILDFLAG(CHROME_ROOT_STORE_SUPPORTED)
std::unique_ptr<SystemTrustStore> CreateSslSystemTrustStoreChromeRoot() {return std::make_unique<SystemTrustStoreChrome>(std::make_unique<TrustStoreChrome>(), std::make_unique<TrustStoreMac>(kSecPolicyAppleSSL, TrustStoreMac::TrustImplType::kDomainCache, 512));
}#elsestd::unique_ptr<SystemTrustStore> CreateSslSystemTrustStoreChromeRoot() {return std::make_unique<DummySystemTrustStore>();
}#endif

2) net/cert/cert_verify_proc.cc

增加BUILTIN_CERT_VERIFIER_FEATURE_SUPPORTED支持

修改静态方法

scoped_refptr<CertVerifyProc> CertVerifyProc::CreateBuiltinVerifyProc(scoped_refptr<CertNetFetcher> cert_net_fetcher) {return CreateCertVerifyProcBuiltin(std::move(cert_net_fetcher),CreateSslSystemTrustStore());
}

#if BUILDFLAG(CHROME_ROOT_STORE_SUPPORTED)
// static
scoped_refptr<CertVerifyProc> CertVerifyProc::CreateBuiltinVerifyProc(scoped_refptr<CertNetFetcher> cert_net_fetcher) {return CreateCertVerifyProcBuiltin(std::move(cert_net_fetcher),CreateSslSystemTrustStoreChromeRoot());
}
#else
// static
scoped_refptr<CertVerifyProc> CertVerifyProc::CreateBuiltinVerifyProc(scoped_refptr<CertNetFetcher> cert_net_fetcher) {return CreateCertVerifyProcBuiltin(std::move(cert_net_fetcher),CreateSslSystemTrustStore());
}
#endif

3) services/cert_verifier/cert_verifier_creation.cc

修改证书校验创建流程

scoped_refptr<net::CertVerifyProc> CreateOldDefaultWithoutCaching(scoped_refptr<net::CertNetFetcher> cert_net_fetcher) {scoped_refptr<net::CertVerifyProc> verify_proc;
#if defined(OS_FUCHSIA) || defined(OS_LINUX) || defined(OS_CHROMEOS)verify_proc =net::CertVerifyProc::CreateBuiltinVerifyProc(std::move(cert_net_fetcher));
#elseverify_proc =net::CertVerifyProc::CreateSystemVerifyProc(std::move(cert_net_fetcher));
#endifreturn verify_proc;
}

scoped_refptr<net::CertVerifyProc> CreateOldDefaultWithoutCaching(scoped_refptr<net::CertNetFetcher> cert_net_fetcher) {scoped_refptr<net::CertVerifyProc> verify_proc;
#if defined(OS_FUCHSIA) || defined(OS_LINUX) || defined(OS_CHROMEOS)verify_proc =net::CertVerifyProc::CreateBuiltinVerifyProc(std::move(cert_net_fetcher));
#elif BUILDFLAG(BUILTIN_CERT_VERIFIER_FEATURE_SUPPORTED)// Create by david.chin on 07/26/2023if (base::FeatureList::IsEnabled(net::features::kCertVerifierBuiltinFeature)) {verify_proc =net::CertVerifyProc::CreateBuiltinVerifyProc(std::move(cert_net_fetcher));} else {verify_proc =net::CertVerifyProc::CreateSystemVerifyProc(std::move(cert_net_fetcher));}
#elseverify_proc =net::CertVerifyProc::CreateSystemVerifyProc(std::move(cert_net_fetcher));
#endifreturn verify_proc;
}

6、编译chromium,等待数小时

效果图

 

沃通测试网站

https://sm2only.ovssl.cn/

 

中国银行(只支持SM2)

https://ebssec.boc.cn/

 

四、写在最后

当然,国密的适配还有不少工作要做,这里只是做了macos的国密根证书内置,后续包括windows、linux、国产操作系统等适配会持续进行。

相关文章:

将SM2根证书预置到chromium中

最近花了很多精力在做chromium的GmSSL适配&#xff0c;协议和算法都已经完成&#xff0c;这篇文章是关于将SM2根证书预置到chromium中 我的开发测试环境是macos12.4&#xff0c;从chromium的代码和文档中得知证书获取和校验都是通过操作系统以及native api接口完成&#xff0c…...

linux安装mysql-8.0.33正确方式及常见问题

目录 获取mysql下载地址链接 解压安装包 复制文件到安装目录 添加用户和用户属组修改权限 创建存储数据的文件夹/usr/local/mysql 初始化安装 修改配置文件 创建日志文件并赋予对应权限 启动成功​编辑 创建软链接 之前安装过mysql&#xff0c;时间比较长忘记安装步骤了今天…...

Vim的插件管理器之Vundle

1、安装Vundle插件管理器 Vim可以安装插件&#xff0c;但是需要手动安装比较麻烦&#xff0c;Vim本身没有提供插件管理器&#xff0c;所以会有很多的第三方的插件管理器&#xff0c;有一个vim的插件叫做 “vim-easymotion”&#xff0c;在它的github的安装说明里有列出对于不同…...

机器学习丨1. 机器学习概述

Author&#xff1a;AXYZdong 硕士在读 工科男 有一点思考&#xff0c;有一点想法&#xff0c;有一点理性&#xff01; 定个小小目标&#xff0c;努力成为习惯&#xff01;在最美的年华遇见更好的自己&#xff01; CSDNAXYZdong&#xff0c;CSDN首发&#xff0c;AXYZdong原创 唯…...

清除pip安装库时的缓存

目录 1、命令清除缓存 2、路径手动清除 在使用pip安装Python库时&#xff0c;如果之前已经下载过该库&#xff0c;pip会默认使用缓存来安装库&#xff0c;而不是重新从网络上下载。缓存文件通常存储在用户目录下的缓存文件夹中&#xff0c;具体位置因操作系统和Python版本而异…...

gitee上传一个本地项目到一个空仓库

gitee上传一个本地项目到一个空仓库 引入 比如&#xff0c;你现在本地下载了一个半成品的框架&#xff0c;现在想要把这个本地项目放到gitee的仓库上&#xff0c;这时就需要我们来做到把这个本地项目上传到gitee上了。 具体步骤 1. 登录码云 地址&#xff1a;https://gite…...

力扣:63. 不同路径 II(Python3)

题目&#xff1a; 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish”&#xff09;。 现在考虑网格中有障碍物。那么从…...

【C语言】每日一题(多数元素)

多数元素&#xff0c;链接奉上 方法 1.摩尔投票2.合理但错误的方法2.1暴力循环2.2排序求出中间元素中间元素 1.摩尔投票 先来简单的介绍摩尔投票&#xff1a; 摩尔投票是一种用来解决绝对众数问题的算法。 什么是绝对众数呢&#xff1f; 在一个集合中&#xff0c;如果一个元素…...

后端 .net7 Minimal API 限流中间件(微信小程序无师自通十)

我的微信小程序使用.net7 Minimal API 作为后端&#xff0c;当服务器摆上公网后&#xff0c;可以观察到很多的攻击行为和暴力访问。所以&#xff0c;我需要使用微软的限流中间件部署相应的功能在服务器上 关键字&#xff1a; AddFixedWindowLimiter using Microsoft.AspNetCo…...

背上沉重的书包准备面试之react篇

目录 react特性&#xff1f; react生命周期&#xff1f; state和props区别 react中setState执行机制&#xff1f; 在react类组件形式中&#xff0c;setState第二个参数的作用&#xff1f; react事件机制&#xff1f; react事件绑定方式有哪些&#xff1f; react组件之间…...

OpenCV-Python中的图像处理-霍夫变换

OpenCV-Python中的图像处理-霍夫变换 霍夫变换霍夫直线变换霍夫圆环变换 霍夫变换 霍夫(Hough)变换在检测各种形状的技术中非常流行&#xff0c;如果要检测的形状可以用数学表达式描述&#xff0c;就可以是使用霍夫变换检测它。即使要检测的形状存在一点破坏或者扭曲也是可以使…...

W5500-EVB-PICO做UDP Client进行数据回环测试(八)

前言 上一章我们用开发板作为UDP Server进行数据回环测试&#xff0c;本章我们让我们的开发板作为UDP Client进行数据回环测试。 连接方式 使开发板和我们的电脑处于同一网段&#xff1a; 开发板通过交叉线直连主机开发板和主机都接在路由器LAN口 测试工具 网路调试工具&a…...

npm install 中 --save 和 --save-dev 是什么?

npm&#xff0c;全名 Node Package Manager&#xff0c;套件管理工具&#xff0c;package.json 会记下你在项目中安装的所有套件。 假设在项目中安装 lodash npm i --save lodash这样在 dependencies 中会出现&#xff1a; 如果修改了导入方式&#xff1a; npm i --save-dev …...

【Nginx17】Nginx学习:目录索引、字符集与浏览器判断模块

Nginx学习&#xff1a;目录索引、字符集与浏览器判断模块 今天要学习的内容有几个还是大家比较常见的&#xff0c;所以学习起来也不会特别费劲。对于目录的默认页设置大家都不会陌生&#xff0c;字符集的设置也比较常见&#xff0c;而浏览器的判断这一块&#xff0c;可能有同学…...

CA/TA开发编程实战-视频课程

Hello大家好&#xff0c;上架一门新的视频课程&#xff0c;课程主要包含两大部分&#xff0c;第一部分搭建环境&#xff0c;第二部分从无到有的编写代码。带领大家"手把手"编写。 具体大纲如下&#xff1a; qemu v8环境搭建 搭建一个qemu_v8的环境&#xff0c;用于…...

(7)(7.1) 使用航点和事件规划任务

文章目录 前言 7.1.1 设置Home位置 7.1.2 视频&#xff1a;制作并保存多路点任务 7.1.3 视频&#xff1a;加载已保存的多航点任务 7.1.4 使用说明 7.1.5 提示 7.1.6 自动网格 7.1.7 任务指令 7.1.8 任务结束 7.1.9 任务重置 7.1.10 MIS_OPTIONS 7.1.11 任务再出发 …...

OCR相关模块——版面分析技术、表格文本识别

OCR相关模块——版面分析技术、表格文本识别 版面分析技术表格识别技术 版面分析技术 版面分析模型&#xff1a;飞桨用到了yolov2检测模型&#xff0c;对文档图片中的文本、表格、图片、标题与列表区域进行检测。当前主流是用分割做。 表格识别技术 参考博文...

mov转mp4格式怎么转?

mov转mp4格式怎么转&#xff1f;众所周知&#xff0c;MOV视频格式是由苹果公司推出的常用的视频格式&#xff0c;能够在苹果软件及设备上使用。但是&#xff0c;如果将其应用于其他软件和设备上的话&#xff0c;可能会遇到文件无法正常播放的情况。在这个时候&#xff0c;我们需…...

SSL握手协议相关概念

下图为握手协议的流程图&#xff0c;具体的解释参考博客&#xff1a; 【下】安全HTTPS-全面详解对称加密&#xff0c;非对称加密&#xff0c;数字签名&#xff0c;数字证书和HTTPS_tenfyguo的博客-CSDN博客 下面梳理一下SSL协议中的一些细节。首先是相关名词&#xff1a;证书、…...

idea 打开java项目后新建的模块中,java文件夹需要变成蓝色,以及resources文件夹变成三条杠的

idea 打开java项目后新建的模块中&#xff0c;java文件夹需要变成蓝色&#xff0c;以及resources文件夹变成三条杠的方法 再选择modules&#xff0c;找到需要变蓝的文件夹&#xff0c;点击sources即可 同理resources文件夹变成三条杠也只需要找到对应文件夹&#xff0c;点击re…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…...

Ubuntu系统下交叉编译openssl

一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机&#xff1a;Ubuntu 20.04.6 LTSHost&#xff1a;ARM32位交叉编译器&#xff1a;arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...

DAY 47

三、通道注意力 3.1 通道注意力的定义 # 新增&#xff1a;通道注意力模块&#xff08;SE模块&#xff09; class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

基于Uniapp开发HarmonyOS 5.0旅游应用技术实践

一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架&#xff0c;支持"一次开发&#xff0c;多端部署"&#xff0c;可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务&#xff0c;为旅游应用带来&#xf…...

spring:实例工厂方法获取bean

spring处理使用静态工厂方法获取bean实例&#xff0c;也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下&#xff1a; 定义实例工厂类&#xff08;Java代码&#xff09;&#xff0c;定义实例工厂&#xff08;xml&#xff09;&#xff0c;定义调用实例工厂&#xff…...

AI编程--插件对比分析:CodeRider、GitHub Copilot及其他

AI编程插件对比分析&#xff1a;CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展&#xff0c;AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者&#xff0c;分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

SpringCloudGateway 自定义局部过滤器

场景&#xff1a; 将所有请求转化为同一路径请求&#xff08;方便穿网配置&#xff09;在请求头内标识原来路径&#xff0c;然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...

Device Mapper 机制

Device Mapper 机制详解 Device Mapper&#xff08;简称 DM&#xff09;是 Linux 内核中的一套通用块设备映射框架&#xff0c;为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程&#xff0c;并配以详细的…...

Linux --进程控制

本文从以下五个方面来初步认识进程控制&#xff1a; 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程&#xff0c;创建出来的进程就是子进程&#xff0c;原来的进程为父进程。…...

Linux离线(zip方式)安装docker

目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1&#xff1a;修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本&#xff1a;CentOS 7 64位 内核版本&#xff1a;3.10.0 相关命令&#xff1a; uname -rcat /etc/os-rele…...