首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >iOS中的客户端证书和身份

iOS中的客户端证书和身份
EN

Stack Overflow用户
提问于 2016-10-11 18:56:18
回答 1查看 3.6K关注 0票数 23

我已经使用SecKeyGeneratePair函数为基于Swift的iOS应用程序生成了私钥和公钥。

然后,我使用iOS CSR generation生成证书签名请求,我的服务器以PEM格式的证书链回复。

我使用以下代码将PEM证书转换为DER格式:

代码语言:javascript
复制
var modifiedCert = certJson.replacingOccurrences(of: "-----BEGIN CERTIFICATE-----", with: "")
modifiedCert =  modifiedCert.replacingOccurrences(of: "-----END CERTIFICATE-----", with: "")
modifiedCert =  modifiedCert.replacingOccurrences(of: "\n", with: "")
let dataDecoded = NSData(base64Encoded: modifiedCert, options: [])

现在,我应该使用let certificate = SecCertificateCreateWithData(nil, certDer)从DER-data创建证书

我的问题是:如何将证书和我在一开始创建的私钥连接起来,并获得这两个私钥(密钥和证书)所属的身份?

也许,将证书添加到密钥链中,并使用SecItemCopyMatching获取身份?我遵循了问题SecIdentityRef procedure中提出的步骤

编辑:

将证书添加到keychain时,我得到状态响应0,我认为这意味着证书已添加到keychain。

代码语言:javascript
复制
let certificate: SecCertificate? = SecCertificateCreateWithData(nil, certDer)
    if certificate != nil{
        let params : [String: Any] = [
            kSecClass as String : kSecClassCertificate,
            kSecValueRef as String : certificate!
        ]
        let status = SecItemAdd(params as CFDictionary, &certRef)
        print(status)
}

现在,当我尝试获取标识时,我得到的状态是-25300 (errSecItemNotFound)。下面的代码用于获取标识。标签是我用来生成私钥/公钥的私钥标签。

代码语言:javascript
复制
let query: [String: Any] = [
    kSecClass as String : kSecClassIdentity,
    kSecAttrApplicationTag as String : tag,
    kSecReturnRef as String: true
]

var retrievedData: SecIdentity?
var extractedData: AnyObject?
let status = SecItemCopyMatching(query as NSDictionary, &extractedData)

if (status == errSecSuccess) {

    retrievedData = extractedData as! SecIdentity?
}

我可以使用SecItemCopyMatching从密钥链获取私钥、公钥和证书,并将证书添加到密钥链,但查询SecIdentity不起作用。有没有可能我的证书与我的密钥不匹配?这是如何检查的?

我以base64格式打印了来自iOS的公钥。打印的内容如下:

代码语言:javascript
复制
MIIBCgKCAQEAo/MRST9oZpO3nTl243o+ocJfFCyKLtPgO/QiO9apb2sWq4kqexHy
58jIehBcz4uGJLyKYi6JHx/NgxdSRKE3PcjU2sopdMN35LeO6jZ34auH37gX41Sl
4HWkpMOB9v/OZvMoKrQJ9b6/qmBVZXYsrSJONbr+74/mI/m1VNtLOM2FIzewVYcL
HHsM38XOg/kjSUsHEUKET/FfJkozgp76r0r3E0khcbxwU70qc77YPgeJHglHcZKF
ZHFbvNz4E9qUy1mWJvoCmAEItWnyvuw+N9svD1Rri3t5qlaBwaIN/AtayHwJWoWA
/HF+Jg87eVvEErqeT1wARzJL2xv5V1O4ZwIDAQAB

然后使用openssl (openssl req -in ios.csr -pubkey -noout)从证书签名请求中提取公钥。打印了以下响应:

代码语言:javascript
复制
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAo/MRST9oZpO3nTl243o+
ocJfFCyKLtPgO/QiO9apb2sWq4kqexHy58jIehBcz4uGJLyKYi6JHx/NgxdSRKE3
PcjU2sopdMN35LeO6jZ34auH37gX41Sl4HWkpMOB9v/OZvMoKrQJ9b6/qmBVZXYs
rSJONbr+74/mI/m1VNtLOM2FIzewVYcLHHsM38XOg/kjSUsHEUKET/FfJkozgp76
r0r3E0khcbxwU70qc77YPgeJHglHcZKFZHFbvNz4E9qUy1mWJvoCmAEItWnyvuw+
N9svD1Rri3t5qlaBwaIN/AtayHwJWoWA/HF+Jg87eVvEErqeT1wARzJL2xv5V1O4
ZwIDAQAB
-----END PUBLIC KEY----

从CSR生成的密钥的开头似乎略有不同。(MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A)。根据问题RSA encryption,MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A似乎是RSA "1.2.840.113549.1.1.1“的base64格式标识符。所以我猜公钥可能没问题吧?

EN

回答 1

Stack Overflow用户

发布于 2016-10-20 04:23:29

生成SSL证书的通常方式是使用私钥来生成CSR,即证书签名请求信息。事实上,你还隐藏了公司、电子邮件等带有密钥签名的信息。有了CSR,然后,您签署您的证书,因此它将与您的私钥和存储在CSR中的信息相关联,而不必考虑公钥。我目前无法在IOS CSR生成项目中看到您可以传递生成的密钥:在我看来,IOS CSR生成项目生成的CSR使用它自己生成的密钥,或者根本没有私钥。这将得到这样的逻辑:你不能从CER或DER中提取私钥,因为它不在那里。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39975716

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档