密码技术 (6) - 证书
一. 前言
前面介绍的公钥密码和数字签名,都无法解决一个问题,那就是判断自己获取的公钥是否期望的,不能确定公钥是否被中间攻击人掉包。所以,证书的作用是用来证明公钥是否合法的。本文介绍的证书就是解决证书的可靠性的技术。
二. 证书的概念和应用场景
1. 概念
证书的全称是公钥证书(Public-Key Certificate,PKC),里面同时还有姓名,组织,邮箱地址等个人信息,并且还有属于此人的公钥,并由认证机构(Certification Authority、Certifying Authority,CA)施加数字签名。只要看到公钥证书,我们就可以知道认证机构认定该公钥属于此人。就如同我们看到某人的驾照,我们就知道该人通过了驾驶考试,因为上面盖有公安局的公章。
2. 证书的应用场景
下面先以一张图介绍证书是怎么应用的,如下:
详细步骤如下:
(1) Bob生成密钥对
要使用公钥密码进行通信,首先需要生成密钥对,Bob生成一对公钥和私钥,并将私钥自己保管,注意:密钥对可以Bob自己生成,也可以由认证机构代为生成。
(2) Bob在认证机构注册自己的公钥
这里,Bob不是直接将公钥发送给Alice,而是发送给认证机构,认证机构在收到Bob的公钥后,需要确认收到的公钥是否为Bob本人所有。
(3) 认证机构用自己的私钥对Bob的公钥施加数字签名并生成证书
认证机构对Bob的公钥加上数字签名,生成数字签名,需要用到认证机构自身的私钥,因此,认证机构也要事先生成密钥对。
(4) Alice得到认证机构的数字签名和Bob的公钥(也就是证书)
Alice需要向Bob发送密文,她会从认证机构获取证书,证书中包含Bob的公钥和机构的数字签名。
(5) Alice使用认证机构的公钥解密数字签名,对比Bob公钥,确认Bob公钥的合法性
Alice使用认证机构的公钥对数字签名进行解密,然后和其中的公钥对比,如果验证一致,则可以认为此公钥确实来自Bob。
(6) Alice用Bob的公钥加密消息并发送给Bob
Alice用Bob的公钥的加密要发送的消息,并将消息发送给Bob。
(7) Bob用自己的私钥解密密文得到Alice的消息
Bob收到Alice的密文,用自己的私钥解密,得到Alice发给自己的消息。
经过上面的步骤,发送者和接收者就实现安全的通信了。
三. 证书的标准规范
证书是由认证机构颁发的,使用者需要对证书进行验证,如果证书的格式不一致就不方便。于是,ITU(International Telecommunication Union,国际电信联盟)和ISO(International Organization for Standardization,国际标准化组织)指定了X.509规范。
X.509证书大致包含:证书序列号、证书颁发者、公钥所有者、SHA-1指纹、MD5指纹、证书ID、有效期(起始时间)、有效期(结束时间)、散列算法、秘钥类型、秘钥ID和秘钥用途。以下是一个完整的自签名证书:
Certificate:
Data:
Version: 1 (0x0)
Serial Number:
31:bf:6e:78:d2:51:97:8d:2c:44:e8:41:9c:3e:ed:75:c5:fc:2f:78
Signature Algorithm: sha256WithRSAEncryption
Issuer: C = CN, ST = GuangDong, L = GuangZhou, O = Example Company, OU = IT Department, CN = to_be_better_wen, emailAddress = admin@example.com
Validity
Not Before: Oct 3 03:31:46 2023 GMT
Not After : Oct 2 03:31:46 2024 GMT
Subject: C = CN, ST = GuangDong, L = GuangZhou, O = Example Company, OU = IT Department, CN = to_be_better_wen, emailAddress = admin@example.com
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
RSA Public-Key: (2048 bit)
Modulus:
00:b3:f9:61:05:a4:f3:3c:d2:2f:2c:a2:9d:36:3b:
7f:69:9b:1d:4b:f0:53:7a:5d:66:ef:66:36:f8:3e:
c0:c6:90:c8:1c:13:d7:60:f3:ec:e4:10:a4:e0:3d:
82:6c:68:96:6e:d9:47:61:03:b0:7c:f6:0f:64:bf:
04:07:d8:8d:c1:50:0a:98:85:0b:f1:13:c7:7c:df:
a4:2d:fc:63:1b:f9:71:78:04:50:9e:2d:06:15:53:
01:9b:f3:04:5a:18:9e:65:55:21:82:07:f3:32:2d:
bb:c6:be:b1:af:bf:6a:fe:76:37:1f:64:2f:9c:2e:
35:bf:0c:50:e5:a6:f7:db:59:7e:60:7d:c0:fb:53:
09:f4:4d:f8:8d:87:9a:d3:e9:39:f3:42:67:53:c1:
78:5e:64:cb:12:a4:08:64:97:3f:53:d5:35:d3:84:
f3:b4:ff:ed:a6:b2:9d:24:94:69:ac:ab:f2:b5:cb:
d8:f8:2f:70:3e:eb:df:28:c8:f4:f0:ed:23:92:92:
2c:35:83:42:ac:11:0c:c0:65:b2:c8:51:c2:51:9f:
c8:ab:a6:85:fd:d3:d1:af:90:13:6c:63:fa:8c:40:
73:aa:c5:33:39:c5:32:ea:b0:a3:99:70:25:8e:60:
57:f3:55:70:8a:38:91:3c:9c:07:32:1d:78:88:94:
09:81
Exponent: 65537 (0x10001)
Signature Algorithm: sha256WithRSAEncryption
61:b1:30:02:6d:a5:0a:3a:33:9a:75:c2:9e:66:5f:3a:86:5f:
71:d8:96:e9:8d:71:93:a7:e5:ef:c2:cd:8a:de:3e:ec:b8:5a:
ff:c1:00:10:a0:3e:fe:0a:1a:81:d3:15:1b:ba:63:80:47:30:
53:e7:f5:4b:0a:8e:f3:a1:97:9f:8a:15:ab:02:71:ea:1b:72:
4c:08:98:01:50:f2:e2:aa:51:8e:31:f3:7a:08:b2:fd:f8:f2:
78:f6:04:16:5b:5f:91:90:3c:08:ed:cc:72:6a:bf:67:c5:67:
00:29:9a:36:52:5d:1b:73:0c:cf:9e:c3:56:f1:19:8c:1f:09:
56:ad:69:f9:eb:3a:5c:8c:8e:da:67:b6:0b:2d:a2:c2:d9:fa:
51:b9:d2:d8:94:96:e1:15:18:a6:de:3a:12:01:16:74:87:62:
a7:7a:c3:d1:02:7f:82:f9:43:5b:28:e5:3a:2e:1a:89:f5:b9:
84:13:e9:90:c8:b0:fc:60:21:54:0c:78:9a:76:42:2e:e2:36:
a4:00:26:f9:0e:e2:cb:7e:8a:15:1a:65:b5:ba:f5:fa:41:c1:
55:05:23:1a:67:de:9d:e5:09:5d:20:66:10:3b:c8:15:7a:33:
4e:fb:fb:17:6e:c4:e1:01:ab:62:18:c8:da:09:bb:35:33:ac:
43:85:91:ff
四. openssl实践
这里将介绍使用openssl生成自签名证书的过程,自签名证书表示只是用于自己使用,使用自己的私钥生成即可,而不需要去找认证机构生成的证书。下面是详细步骤:
1. 生成私钥
openssl genrsa -out private.key 2048
这里直接生成了2048比特的私钥。没有对私钥进行加密,如果需要对私钥加密,则要加对称密码算法选项,例如:-aes128,输入命令回车后,会提示输入密码。
2. 创建证书签名申请文件
证书签名申请(Certificate signing request,CSR),该申请包含申请者的公钥和申请者的某些信息,这个文件在正常的情况下,是由申请者自己生成,然后提交给认证机构的,认证机构用这个文件来生成证书。命令如下:
[root@ ca]#openssl req -new -key private.key -out fd.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:CN
State or Province Name (full name) [Some-State]:GuangDong
Locality Name (eg, city) []:GuangZhou
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Example Company
Organizational Unit Name (eg, section) []:IT Department
Common Name (e.g. server FQDN or YOUR name) []:to_be_better_wen
Email Address []:admin@example.comPlease enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
输完命令回车后,会提示输入一些信息,包括国家,省,市,公司,部门,姓名和邮箱。challenge password和optional company name可以留空。
CSR文件内容如下:
[root@ ca]#cat fd.csr
-----BEGIN CERTIFICATE REQUEST-----
MIIC6jCCAdICAQAwgaQxCzAJBgNVBAYTAkNOMRIwEAYDVQQIDAlHdWFuZ0Rvbmcx
......
/xitQdLpj0yvWbFcPwAB8R6lqtR+2e/c1nZaMvHk
-----END CERTIFICATE REQUEST-----
可以看到,CSR文件是以BEGIN CERTIFICATE REQUEST开头,以END CERTIFICATE REQUEST结尾的。
可以使用如下命令查看CSR文件的内容:
[root@ ca]#openssl req -text -in fd.csr -noout
Certificate Request:
Data:
Version: 1 (0x0)
Subject: C = CN, ST = GuangDong, L = GuangZhou, O = Example Company, OU = IT Department, CN = to_be_better_wen, emailAddress = admin@example.com
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
RSA Public-Key: (2048 bit)
Modulus:
00:b3:f9:61:05:a4:f3:3c:d2:2f:2c:a2:9d:36:3b:
......
09:81
Exponent: 65537 (0x10001)
Attributes:
a0:00
Signature Algorithm: sha256WithRSAEncryption
10:69:27:36:0a:14:1f:1b:31:bd:51:de:22:c7:95:c3:30:0f:
......
5a:32:f1:e4
3. 生成自签名证书
使用之前生成的私钥和CSR文件就可以生成自签名证书了,命令如下:
openssl x509 -req -days 365 -in fd.scr -signkey private.key -out fd.crt
x509表示生成x.509格式的证书,-days 365表示证书的有效期为1年,fd.crt则是最终的证书了。
证书的内容如下:
[root@ ca]#cat fd.crt
-----BEGIN CERTIFICATE-----
MIID0TCCArkCFDG/bnjSUZeNLEToQZw+7XXF/C94MA0GCSqGSIb3DQEBCwUAMIGk
......
+/sXbsThAatiGMjaCbs1M6xDhZH/
-----END CERTIFICATE-----
4. 检查证书
由上可知,证书的内容是不可读的,无法直接检查,需要使用命令转化可读,命令如下:
[root@ ca]#openssl x509 -text -in fd.crt -noout
Certificate:
Data:
Version: 1 (0x0)
Serial Number:
31:bf:6e:78:d2:51:97:8d:2c:44:e8:41:9c:3e:ed:75:c5:fc:2f:78
Signature Algorithm: sha256WithRSAEncryption
Issuer: C = CN, ST = GuangDong, L = GuangZhou, O = Example Company, OU = IT Department, CN = to_be_better_wen, emailAddress = admin@example.com
Validity
Not Before: Oct 3 03:31:46 2023 GMT
Not After : Oct 2 03:31:46 2024 GMT
Subject: C = CN, ST = GuangDong, L = GuangZhou, O = Example Company, OU = IT Department, CN = to_be_better_wen, emailAddress = admin@example.com
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
RSA Public-Key: (2048 bit)
Modulus:
00:b3:f9:61:05:a4:f3:3c:d2:2f:2c:a2:9d:36:3b:
......
09:81
Exponent: 65537 (0x10001)
Signature Algorithm: sha256WithRSAEncryption
61:b1:30:02:6d:a5:0a:3a:33:9a:75:c2:9e:66:5f:3a:86:5f:
......
43:85:91:ff
至此,公钥证书就生成完毕了。
5. 从证书中提取公钥
消息的发送者获取到了证书,这时需要从证书中提取公钥,用于加密消息。可以使用如下命令提取公钥:
openssl x509 -in fd.crt -pubkey -noout > public.key
五. 总结
本文介绍了证书的作用:用于证明公钥的合法性。以及介绍了当消息发送者和消息接收者通信前,消息接收者怎么向认证机构(CA)申请证书的大致步骤,最后介绍了使用openssl怎么生成一个自签名证书。
相关文章:
密码技术 (6) - 证书
一. 前言 前面介绍的公钥密码和数字签名,都无法解决一个问题,那就是判断自己获取的公钥是否期望的,不能确定公钥是否被中间攻击人掉包。所以,证书的作用是用来证明公钥是否合法的。本文介绍的证书就是解决证书的可靠性的技术。 二…...
【算法学习】-【双指针】-【盛水最多的容器】
LeetCode原题链接:盛水最多的容器 下面是题目描述: 给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。…...
JAVA面经整理(8)
一)为什么要有区,段,页? 1)页是内存和磁盘之间交互的基本单位内存中的值修改之后刷到磁盘的时候还是以页为单位的索引结构给程序员提供了高效的索引实现方式,不过索引信息以及数据记录都是记录在文件上面的,确切来说是…...
【Java 进阶篇】JDBC数据库连接池Druid详解
在Java应用程序中,与数据库进行交互是一个常见的任务。为了更有效地管理数据库连接并提高性能,数据库连接池是一种常见的解决方案。Druid是一个流行的JDBC数据库连接池,它具有丰富的功能和高性能。本博客将详细介绍Druid连接池,包…...
Linux——指令初识
Linux下基本指令 前言一、 ls 指令二、 pwd命令三、cd 指令四、 touch指令五、mkdir指令六、rmdir指令 && rm 指令七、man指令八、cp指令九、mv指令十、cat指令十一、.more指令十二、less指令十三、head指令十四、tail指令总结 前言 linux的学习开始啦! 今…...
专题一:双指针【优选算法】
双指针应用场景: 数组划分、数组分块 目录 一、移动0 二、复写0 从后向前 三、快乐数 链表带环 四、盛水最多的容器 单调性双指针 五、有效三角形个数 单调性双指针 六、和为s的两个数字 七、三数之和 细节多 需再练 一、移动0 class Solution { public:void move…...
蓝桥等考Python组别十二级007
第一部分:选择题 1、Python L12 (15分) 运行下面程序,输出的结果是( )。 lis = [A, B, C, D, E, F] print(lis[0 : 3]) [A, B, C][A, B][A, B, C, D][B, C, D]正确答案:A 2...
全方位介绍工厂的MES质量检验管理系统
一、MES质量检验管理系统的定义: MES质量检验管理系统是基于制造执行系统的框架和功能,专注于产品质量的控制和管理。它通过整合和优化质量检验流程,提供实时的数据采集、分析和反馈,帮助工厂实现高效的质量管理。该系统涵盖了从…...
避免风险,亚马逊、沃尔玛、阿里国际站选择什么样的测评方式最安全?
亚马逊、沃尔玛、速卖通、阿里国际站上做测评是最有效的推广手段之一,而测评又存在很大的风险。但是测评的风险来自哪里?什么样的测评方式才安全呢? 因为平台大数据风控点很多,根据洪哥六七年的测评经验,风控包括以下…...
【C语言】语法--联合体union详解
本文参考博客: https://blog.csdn.net/m0_57180439/article/details/120417270 定义及示例: 联合是一种特殊的自定义类型,该种类型定义的变量也包含一系列的成员,特征是这些成员共用同一块空间,所以联合体也被称为共用体。 #include<stdio.h> union Un//联合类型…...
接口测试复习
一。基本概念 接口概念:系统与系统之间 数据交互的通道。 接⼝测试概念:校验 预期结果 与 实际结果 是否⼀致。 特征: 测试⻚⾯测试发现不了的问题。(因为:接⼝测试 绕过前端界⾯。 ) 符合质量控制前移理…...
获取医疗器械板块的个股列表
获取医疗器械板块的个股列表,用python爬虫做到(数据网址:板块 - 医疗器械概念 - 股票行情中心 - 搜狐证券) import requests from bs4 import BeautifulSoup # 获取医疗器械概念个股列表url "https://q.stock.sohu.com/cn/…...
1026 程序运行时间
要获得一个 C 语言程序的运行时间,常用的方法是调用头文件 time.h,其中提供了 clock() 函数,可以捕捉从程序开始运行到 clock() 被调用时所耗费的时间。这个时间单位是 clock tick,即“时钟打点”。同时还有一个常数 CLK_TCK&…...
博途1200/1500 ALT指令
SMART PLC的ALT指令实现代码,请查看下面文章博客 SMART PLC如何构造ALT指令_smart200类似alt指令-CSDN博客单按钮启停这些老生常谈的问题,很多人感兴趣。这篇博文讨论下不同的实现方法,希望对大家有所帮助。指令虽然简单,但是在编程的时候合理使用对我们高效率编程帮助还是…...
11、视频分类建议
8、绩效看板与日清计划 9、大小屏分离与精细化审核 10、质量审核的设立与合并 视频分类印象深刻,因为这是我亲手做的第一个增效工具。 审核的其中一个任务是保证视频分类信息的准确性,账号本身是有一个缺省分类的,内容上传之后默认使用账号…...
【计算机组成原理】考研真题攻克与重点知识点剖析 - 第 2 篇:数据的表示和运算
前言 本文基础知识部分来自于b站:分享笔记的好人儿的思维导图与王道考研课程,感谢大佬的开源精神,习题来自老师划的重点以及考研真题。此前我尝试了完全使用Python或是结合大语言模型对考研真题进行数据清洗与可视化分析,本人技术…...
使用maven框架搭建一个IDEA插件项目
以下是使用 Maven 框架搭建 IDEA 插件项目的步骤: 打开 IDEA,点击 File -> New -> Project,选择 Maven。 在弹出的 New Project 窗口中,选择 Maven,然后选择 Create from archetype,找到 Maven 插件…...
第二届全国高校计算机技能竞赛——C++赛道 题解
Powered by:NEFU AB-IN Link 文章目录 第二届全国高校计算机技能竞赛——C赛道A 互不侵犯题意思路代码 B 奖学金题意思路代码 C 领导者题意思路代码 D 空调题意思路代码 E 字符操作变换题意思路代码 第二届全国高校计算机技能竞赛——C赛道 A 互不侵犯 题意 在象棋中ÿ…...
八大排序源码(含优化)
文章目录 1、直接插入排序2、希尔排序3、选择排序4、冒泡排序5、堆排序6、快速排序快速排序递归实现霍尔法挖坑法前后指针法快速排序小区间优化 快速排序非递归实现 7、归并排序归并排序递归实现归并排序非递归 8、计数排序 大家好,我是纪宁,这篇文章是关…...
单调队列---数据结构与算法
简介 队列也是一种受限制的线性表和栈相类似,栈是先进后出,而队列是先进先出,就好像一没有底的桶,往里面放东西,如图 在这里也是用数组来实现队列,用数组实现的叫做顺序队列 队列的数组模拟 const int N…...
小程序如何使用自定义组件
使用自定义组件的步骤如下: 创建自定义组件:在小程序项目根目录下的 components 文件夹中创建一个文件夹,然后在该文件夹中创建一个 .json 文件、一个 .wxml 文件和一个 .js 文件,这三个文件分别对应组件的配置、模板和逻辑。 在…...
归并排序含非递归版
目录 1.归并排序的原理 2.实现归并排序 2.1框架 2.2区间问题和后序遍历 2.3归并并拷贝 2.4归并排序代码 2.5测试 3.非递归实现归并排序 3.1初次实现 3.2测试 3.3修改 3.4修改测试 1.归并排序的原理 归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治…...
项目进展(八)-编写代码,驱动ADS1285
一、代码 根据芯片的数据手册编写部分驱动,首先看部分引脚的波形: DRDY: CS: 首先在代码初始化时连续写入三个寄存器: void WriteReg(uint8_t startAddr, uint8_t *regData, uint8_t number) {uint8_t i0;// 循环写number1次…...
【MyBatis-Plus】快速精通Mybatis-plus框架—快速入门
大家在日常开发中应该能发现,单表的CRUD功能代码重复度很高,也没有什么难度。而这部分代码量往往比较大,开发起来比较费时。 因此,目前企业中都会使用一些组件来简化或省略单表的CRUD开发工作。目前在国内使用较多的一个组件就是…...
docker 安装kafka
运行容器 zookeeper: [rootk8s-master ~]# docker run -d --restartalways --log-driver json-file --log-opt max-size100m --log-opt max-file2 --name zookeeper -p 2181:2181 -v /etc/localtime:/etc/localtime zookeeper c603f292813cfd6e2b16fff88a9767cc86fc9bba34d82…...
容器内获得apiserver地址
1.容器的Env的KUBENETES_SERVICE_HOST字段 roottomcat01-69fc8f859b-w9btn:/tmp# env | grep KUBERNETES_SERVICE_HOST10.96.0.1 KUBERNETES_SERVICE_HOST10.96.0.12.通过域名查询 nslookup getent hosts roottomcat01-69fc8f859b-w9btn:/tmp# getent hosts kubernetes.def…...
linux服务端c++开发工具介绍(vscode版)
本文适合于有一定c开发经验,但是还不明确如何到linux服务端开发程序的同学。 一、vscode 几年前用的是ssh到云服务上,再用vim在云上开发的形式 ssh dongbeijing.dbj11.158.142.176 vim hello.c 现今,由于vscode比较好用,这几年…...
Linux常用命令大全
Linux常用命令大全 一、文件&目录管理1. 文件和目录操作命令2. 查看文件及内容处理命令3. 文件压缩及解压缩命令4. 搜索文件命令5. 其他 二、Linux 软件包管理三、用户管理1. 用户管理2. 查看系统用户登陆信息的命令 四、进程管理五、网络通信1. 基础网络操作命令2. 深入网…...
Python中取2023, 9, 1——2023, 10, 31的全部时间
使用datetime.date()函数定义了开始和结束日期。然后,我们使用datetime.timedelta()类创建了一个时间范围,其中n表示从开始日期到结束日期之间的天数。最后,我们使用一个for循环迭代时间范围内的日期,并打印每个日期。示例代码演示…...
创建django文件
1、在指定目录里打开终端,输入D:\Softwares\Anaconda3\envs\pytorch\Scripts\django-admin .exe startproject 名称 ,即可在对应目录里创建django文件。...
网站本地化怎么做/百度流量统计
这个错误消息表明,您正在尝试加载一个 32 位的 libxml2 库文件,但是您的系统是 64 位系统。解决方法是安装对应于您系统的 64 位版本的 libxml2。在 Windows 上,您可以在网上搜索 "libxml2 windows 64",找到并下载正确版…...
网站推广优化的公司/盐城seo推广
疯狂 Java 程序员的基本修养归纳了Java学习者、工作者在学习、工作过程中最欠缺的技术短板,本书把Java编程中的重点、要点、难点、常见陷阱收集在一起,旨在帮助读者重点突破这些看似"司空见惯"的基本功。《疯狂 Java 程序员的基本修养》知识主…...
手机网站建设服务电话/地推放单平台
代码快速注释 支持对选择的代码块进行快速注释,使用快捷键Ctrl/快速进行注释。对于已注释的代码快,再次使用快捷键Ctrl/取消注释。 更多技术交流请加入QQ群 群名称:harmonyos鸿蒙技术交流 群 号:856567895 从零开始入门学习Harm…...
网站建设方案浩森宇特/陕西网站建设网络公司
缘由:数据去重,可以使用SET,也可以使用mysql的唯一主键,或者使用redis。但是设置唯一主键,爬虫写入很慢。XP系统原先折腾过redis,但是前段时间又不会折腾了。总之XP折腾redis很麻烦,吃力不讨好。…...
自己做的网站怎么接入银联支付/seo英文怎么读
昨天因为Tomcat问题装了JDK1.6,原来的jdk是1.8的,然后今天启动eclipse出现异常,Java was started but returned exit 1。 异常中已经说明java is started 说明java运行是正常的(不放心可以去命令行dos下测试java环境)&…...
广州市区号/网站网络排名优化方法
先看下效果 全部代码贴出,自己粘贴调试测试: 1 <!DOCTYPE html>2 <html lang"en">3 <head>4 <meta charset"UTF-8">5 <title>css加载样式</title>6 </head>7 <style>8 /*效…...