- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在用 Swift 4 编写一组将在 Linux 上运行的服务。我需要做的一件事是接收使用加密消息语法 (CMS) 格式进行数字签名的有效负载,提取用于对其进行签名的证书,然后验证签名。我知道 Linux 上的 Swift 不包含用于此类事情的 Security 或 CommonCrypto 框架,因此我已经链接到 OpenSSL 以尝试帮助解决这个问题。我已经离开我的 C/C++ 编程时代大约 2 年了,所以我欣然承认我在这部分代码上不知所措。
我有 2 个简单的类作为 OpenSSL 的包装器 BIO
和 PKCS7
数据结构。它们看起来像这样:
import Foundation
import OpenSSL
public final class BIOWrapper {
public var bio = BIO_new(BIO_s_mem())
public init(data: Data) {
data.withUnsafeBytes { pointer -> Void in
BIO_write(self.bio, pointer, Int32(data.count))
}
}
public init() {}
deinit {
BIO_free(self.bio)
}
}
public final class PKCS7Wrapper {
public var pkcs7: UnsafeMutablePointer<PKCS7>
public init(pkcs7: UnsafeMutablePointer<PKCS7>) {
self.pkcs7 = pkcs7
}
deinit {
PKCS7_free(self.pkcs7)
}
}
我能够成功提取 PKCS#7 容器数据并验证数据类型代码值为 NID_pkcs7_signed
使用此代码:
let reqData = Data(bytes: reqBytes)
guard reqData.count > 0 else {
print("Empty request body")
return nil
}
let bioWrapper = BIOWrapper(data: reqData)
guard let container = d2i_PKCS7_bio(bioWrapper.bio, nil) else {
print("No container")
return nil
}
let pkcs7Wrapper = PKCS7Wrapper(pkcs7: container)
let dataTypeCode = OBJ_obj2nid((pkcs7Wrapper.pkcs7.pointee.d.sign).pointee.contents.pointee.type)
print("dataTypeCode : \(dataTypeCode)")
if dataTypeCode == NID_pkcs7_data {
print("GOT DATA!")
} else {
print("Didn't get data")
return nil
}
let pkcs7SignedTypeCode = OBJ_obj2nid(pkcs7Wrapper.pkcs7.pointee.type)
if let signed = pkcs7SignedTypeCode == NID_pkcs7_signed {
print("Signed : \(signed)")
}
但是,我现在已经到了卡住的地步。如何从 PKCS#7 负载中获取 X.509 证书数据?我可以看到 pkcs7Wrapper.pkcs7.pointee.d.sign.pointee.cert
数据结构应包含证书链数据。它的数据类型是UnsafeMutablePointer<stack_st_x509>
我想我可以找出使用 OpenSSL 的 PKCS7_verify
的代码一旦我在内存中获得 X.509 证书数据。我只是不知道该怎么做。
我找到了 this resource讨论在 OSX/iOS 上验证收据,涉及很多相同的问题。他们从文件系统获取 X.509 证书并将数据传递到 PKCS7_verify
方法。我只需要知道如何从 PKCS#7 容器中获取证书数据并传入即可。
谁能帮我解决这个问题?我认识到从 Swift 调用 C 并不理想,但由于 Swift 没有良好的安全/加密框架,我不知道有任何其他选择。
最佳答案
答案的核心部分在您链接的代码中:
let store = X509_STORE_new()
X509_STORE_add_cert(store, appleRootX509)
OpenSSL_add_all_digests()
let result = PKCS7_verify(receiptPKCS7, nil, store, nil, nil, 0)
if result != 1 {
log.atLevelDebug(id: 0, source: "Main", message: "Receipt signature verification failed")
exit(errorCode)
}
您似乎缺少的事实是您不必自己从 PKCS7 数据中提取 X509 证书。 PKCS7_verify
function will do it作为验证的一部分:
An attempt is made to locate all the signer's certificates, first looking in the certs parameter (if it is not NULL) and then looking in any certificates contained in the p7 structure itself. If any signer's certificates cannot be located the operation fails.
因此,您需要自己加载的唯一证书是您观察到它们从 linked code 中的文件系统加载的根证书。 .
如果您出于某种原因仍然确实需要 Swift 解决方案来从 PKCS7 数据中提取证书,则必须为 PKCS7 构建一个 ASN.1 解析器。不确定这是否适用于 Swift,this simple code是快速搜索的结果,this是对 PKCS7 数据的很好描述。
关于c - swift (Linux) : Extract CMS/PKCS#7 Certs and Validate Container Signature?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49451395/
你发现标题的不同了吗? (对我来说,花了一些时间) 所以我按顺序使用了连接到 java.security.cert.X509Certificate 的充气城堡创建证书。现在我正在寻找一种从原始字节创建
我有一整天都在努力解决的问题,但就是无法重建。我遇到了引发 CertificateNotYetValidException 异常的问题: java.security.cert.CertificateN
我有一个服务器和一个客户端。我让他们都在同一台机器上运行。我正在尝试在客户端和服务器之间建立 SSL 连接。我已经使用以下 keytool 命令为服务器和客户端生成了证书。 对于客户keytool -
在本地,我一直在使用一个 Nginx 容器进行开发,该容器在一个目录中包含所有 ssl 配置和 ssl 证书。 但是,既然我即将转向生产,我很好奇将证书放在 nginx 容器中是否是一种好的做法? 或
我想根据 CRL 验证客户端提供的 X509 证书是否已被吊销。我已经成功地实例化了一个 java.security.cert.X509CRL,但是我在检索 session 证书时遇到了问题: try
我在使用 X509TrustManager 检查服务器是否可信时收到异常错误。我按照开发人员的说明进行操作:https://developer.android.com/training/article
我正在尝试使用 Java 代码从安全(即 SSL)网页中读取内容。我正在尝试同时使用 URLConnection (java.net) 和 Apache 的 HTTPClient。在这两种情况下,当我
如果我仅使用证书(带链)和私钥发出 openssl 调用,我会遇到服务器拒绝握手中的客户端证书的问题。 如果我还设置了 cafile 参数并将其指向与证书相同的文件,这个问题就会消失。 即使信息已经在
我正在使用由 CA 文件签名的证书来保护 kubernetes API。为此,我将我的 CA 文件 sa.crt 添加到 /etc/pki/ca-trust/source/anchors/ 并使用命令
我使用facepy与python进行GAE 我遇到了一个错误,当我跟踪该错误时,我发现 from . import certs 在utils.py文件中 点(.)是什么意思? certs.py 与 u
本文整理了Java中org.bouncycastle.cert.X509CRLHolder类的一些代码示例,展示了X509CRLHolder类的具体用法。这些代码示例主要来源于Github/Stack
本文整理了Java中org.bouncycastle.cert.X509v2CRLBuilder类的一些代码示例,展示了X509v2CRLBuilder类的具体用法。这些代码示例主要来源于Github
本文整理了Java中org.bouncycastle.cert.X509ExtensionUtils类的一些代码示例,展示了X509ExtensionUtils类的具体用法。这些代码示例主要来源于Gi
本文整理了Java中org.bouncycastle.cert.X509AttributeCertificateHolder类的一些代码示例,展示了X509AttributeCertificateHo
我按照此说明在我的 EKS 集群上设置了一个证书管理器 https://cert-manager.io/docs/tutorials/acme/ingress/ . 这是我的入口 apiVersion
遵循https://cert-manager.io/docs/installation/kubernetes/中提到的步骤 # Kubernetes 1.16+ $ kubectl apply --v
我按照此说明在我的 EKS 集群上设置了一个证书管理器 https://cert-manager.io/docs/tutorials/acme/ingress/ . 这是我的入口 apiVersion
过去 2 天我遇到了此错误。这似乎是 python requests 库的问题,但我已经重新安装了好几次了,但没有成功。 Traceback (most recent call last):
我有一台运行 Debian 8.1、Apache 2.4.10 和 OpenSSL 1.0.1k 的服务器。我有一个域 example.com,其中包含几个子域,例如 www.example.com、
我正在使用 cUrl 从公司网站请求数据,使用他们发送给我的 .cer 证书。这是命令: cUrl --header "Content-Type: text/xml;charset=UTF-8" \
我是一名优秀的程序员,十分优秀!