OCSP makefile - 学习记录 2021/2/19

本文介绍了OCSP(Online Certificate Status Protocol)协议,它是用来查询X.509证书状态的轻量级协议,旨在替代CRL以减少服务器和客户端的压力。OCSP请求包括证书编号、CA名称和公钥Hash值,响应则包含状态码和其他相关信息。此外,还简述了Makefile中关于动态库的使用,展示了如何编译并链接动态库。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

研二


OCSP

轻量级的证书状态查询数据结构,以ASN.1语法作为传输的编码。OCSP被提出的目的是替代CRL,CRL协议的原理是:客户端通过向服务端请求证书撤销列表来确认相应的证书是否已被撤销,证书撤销时间,证书有效期等信息。由于CRL返回的数据量过大,因此对客户端和服务端压力都较大。CRL的提出正是为了解决该问题。在CRL协议中,客户端将需要的证书的编号发给OCSP服务器,服务器通过查询证书状态后直接向客户端返回一个表述证书状态的整数值以及相应的详细信息(详细信息这一项是可选的,服务器发不发都可以)。其中中,整数值的集合包含:成功(0),非法请求(1),内部错误(2),请求重发(3)(这个不太懂),签名请求(5),请求方身份异常(6)。
OCSP遵循RFC6960[1]标准,在RFC中的分类为“Standard Track",表明其已成为实际应用的国际标准。
OCSP作为查询证书状态的一种协议,包含Request(请求)和Response(应答)两部分。
“请求”部分由客户端或称为用户向服务端发起,至少应包含要查询的证书的编号、签发该证书的CA名称的Hash值、签发该整数的CA公钥的Hash值这三个基本信息。由于不同CA可以签发出相同编号的证书,因此这个仅仅在请求中提供这个证书编号并不能完全唯一地标识证书,因而需要上面提到的两个Hash值来选定相应的CA。
除以上三个必要信息外,OCSP“请求”中还可以选择性地包含:请求发起者对重要信息的签名值(须相应提供签名算法),请求发起者的证书信任链(本人的证书和CA的证书),用于防止重放攻击的随机数等。为了提高可扩展性,OCSP标准中定义了两个扩展域,扩展域中的值可由客户端和服务端自行协商,也就是可以让开发者自行定义。但相应的,OCSP标注中也提供了几个推荐的扩展域可供选择。
“应答”部分是服务端收到客户端的请求后,通过内部查询功能确认证书状态后返回给客户端的回复消息。回复消息包含的信息内容相当弹性,除了一个必须包含的“状态码”外,可以完全不含任何内容,也可以包含相当多的信息。之所以翻译成为“状态码”,而不是“证书状态”,是因为该返回码并不一定表示证书的状态,也可能表示网络请求有误、请求者身份不被OCSP服务器认同等各种状态。事实上,将该返回码称作“错误码”更贴切一些,只不过错误码听起来似乎并不是太亲切。
“应答”部分除了返回状态码外,还可以返回对错误的相应描述,证书状态的更新时间,下次更新时间,有效期,OCSP报文签发日期,服务器对以上数据的签名值等。

makefile

写了个比较大的makefile,复习了一下动态库[2]的知识。

prog:
	gcc -c $(SOURCES) -I $(INCLUDES)
	gcc $(OBJECTS) -o $(TARGET) -fPIC -shared -L. -lASN1

其中*-L.*的作用是设置链接库的位置,"."代表本目录,即 “./”

参考文献

[1] RFC6960: X.509 Internet Public Key Infrastructure Certificate Status Protocol - OCSP, https://tools.ietf.org/html/rfc6960
[2] GCC 编译使用动态链接库和静态链接库: https://blog.youkuaiyun.com/orzlzro/article/details/6460058

<think>好的,现在用户给了一个新的问题,是关于使用curl命令检查钉钉网站的SSL证书是否正常。我需要先理解用户的问题,然后回顾之前的对话历史,确保回答符合之前的指导方针。 首先,用户执行的命令是`curl -vI https://dingtalk.com 2>&1 | grep "SSL certificate verify"`,目的是检查SSL证书验证是否正常。用户提到“证书正常”,但可能想确认这个结果是否可靠,或者了解如何正确解读命令输出。 接下来,我需要考虑用户可能的背景。用户可能在使用curl进行SSL证书验证,可能是在排查HTTPS连接问题,或者确保网站的安全性。用户可能对SSL证书的验证机制不太熟悉,需要解释如何正确检查证书状态。 根据之前的回答,我需要遵循系统级指令:行内数学表达式用$...$,独立公式用$$...$$,但这个问题可能不需要数学公式。不过需要确保LaTeX语法正确,虽然这里可能用不上。使用中文回答,结构清晰,分步骤解决问题。 用户的问题涉及curl命令的输出解析,特别是关于SSL证书验证的部分。需要解释命令的每个部分,以及如何判断证书是否正常。同时,可能需要指出用户使用的命令是否有局限性,比如是否真的能准确反映证书状态。 在之前的对话中,用户遇到了连接重置的问题,现在转向SSL证书验证,可能是在不同的故障排查阶段。需要确保回答准确,帮助用户理解输出结果,并提供进一步的验证方法,以防用户当前的命令不够全面。 可能的思考点包括: 1. 解释curl命令的选项:-vI的作用,2>&1将标准错误重定向到标准输出,grep过滤特定信息。 2. SSL证书验证成功或失败时,curl的输出会有什么不同。 3. 用户当前的命令是否足够判断证书正常,是否存在遗漏的情况。 4. 提供其他验证方法,如使用openssl命令检查证书详细信息,或访问在线SSL检查工具。 5. 提醒用户注意证书颁发机构、有效期、域名匹配等情况,这些因素也会影响证书的有效性。 需要确保回答结构清晰,分步骤说明,验证方法可靠,并指出潜在的问题和解决方案。同时,按照用户要求,使用中文,避免使用Markdown格式,但根据之前的示例,可能用户允许使用一定的结构如代码块和步骤列表。 最后,总结关键点,确保用户能够全面理解如何检查SSL证书,并确认当前证书状态是否真的正常。</think>--- ### **命令解析** 你使用的命令是: ```bash curl -vI https://dingtalk.com 2>&1 | grep "SSL certificate verify" ``` - **`-vI`**:`-v` 表示显示详细输出(包括SSL握手过程),`-I` 表示仅获取HTTP头部。 - **`2>&1`**:将标准错误(stderr)合并到标准输出(stdout),确保能通过管道(`|`)过滤错误信息。 - **`grep "SSL certificate verify"`**:筛选包含证书验证状态的行。 如果输出中**未显示错误**(例如`SSL certificate verify ok`),则表明证书验证通过。以下是详细分析: --- ### **证书验证的关键输出** 正常情况下的成功验证会显示以下信息: ```bash * SSL certificate verify ok. * SSL certificate verify result: 0 (ok) ``` 若证书异常,则会明确提示错误类型,例如: ```bash * SSL certificate problem: self-signed certificate * SSL certificate verify failed: certificate has expired ``` --- ### **分步验证方法** #### **1. 直接查看完整SSL握手过程** 运行命令 **(不筛选结果)**: ```bash curl -vI https://dingtalk.com ``` 观察以下关键字段: - **`SSL certificate verify ok`**:证书链验证通过。 - **`issuer`**:证书颁发机构(钉钉证书应为可信CA如DigiCert、GlobalSign等)。 - **`expire date`**:证书是否在有效期内。 #### **2. 明确检查证书验证结果** 通过以下命令直接提取验证状态: ```bash curl -vI https://dingtalk.com 2>&1 | grep -E "SSL certificate verify|SSL certificate problem" ``` 输出结果可能: - **正常**:`SSL certificate verify ok` 或 `SSL certificate verify result: 0 (ok)` - **异常**:明确提示错误原因(如域名不匹配、过期、CA不受信任等)。 --- ### **常见证书问题排查** #### **场景1:证书链不完整** - **现象**:`self-signed certificate` 或 `unable to get local issuer certificate` - **解决方案**: ```bash # 更新系统的CA证书库(Linux/Mac) sudo apt-get install ca-certificates # Debian/Ubuntu brew update && brew upgrade openssl # macOS via Homebrew ``` #### **场景2:证书过期** - **现象**:`certificate has expired` - **验证方法**: ```bash # 使用openssl查看证书有效期 openssl s_client -connect dingtalk.com:443 -servername dingtalk.com 2>/dev/null | openssl x509 -noout -dates ``` 输出示例: ```bash notBefore=Jan 1 00:00:00 2023 GMT notAfter=Dec 31 23:59:59 2024 GMT ``` #### **场景3:域名不匹配** - **现象**:`Certificate subject name '*.wrong.com' does not match target host name 'dingtalk.com'` - **原因**:证书未包含钉钉的域名(检查证书的`Subject Alternative Name`字段)。 --- ### **证书验证的局限性** 即使命令显示`SSL certificate verify ok`,仍需注意: 1. **证书透明度(CT)**:是否被浏览器或操作系统标记为风险。 2. **吊销状态**:证书可能被CA主动吊销(需通过OCSP检查): ```bash openssl s_client -connect dingtalk.com:443 -status < /dev/null 2>&1 | grep "OCSP response" ``` 3. **中间人攻击(MITM)**:企业网络可能劫持HTTPS流量并替换证书。 --- ### **进阶工具推荐** 1. **在线检测**: - [SSL Labs测试](https://www.ssllabs.com/ssltest/analyze.html?d=dingtalk.com) - [Why No Padlock?](https://www.whynopadlock.com/) 2. **本地工具**: ```bash # 使用nmap检查证书 nmap --script ssl-cert -p 443 dingtalk.com ``` --- ### **结论** - **你的当前结果**:若命令输出包含`SSL certificate verify ok`,则钉钉的SSL证书**验证通过且未被篡改**。 - **补充建议**:结合`openssl`或在线工具进一步确认证书完整性和吊销状态。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值