我已经使用SecKeyGeneratePair
函数为基于Swift的iOS应用程序生成了私钥和公钥。
然后,我使用iOS CSR generation生成证书签名请求,我的服务器以PEM格式的证书链回复。
我使用以下代码将PEM证书转换为DER格式:
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。
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)。下面的代码用于获取标识。标签是我用来生成私钥/公钥的私钥标签。
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的公钥。打印的内容如下:
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)从证书签名请求中提取公钥。打印了以下响应:
-----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格式标识符。所以我猜公钥可能没问题吧?
发布于 2016-10-20 04:23:29
生成SSL证书的通常方式是使用私钥来生成CSR,即证书签名请求信息。事实上,你还隐藏了公司、电子邮件等带有密钥签名的信息。有了CSR,然后,您签署您的证书,因此它将与您的私钥和存储在CSR中的信息相关联,而不必考虑公钥。我目前无法在IOS CSR生成项目中看到您可以传递生成的密钥:在我看来,IOS CSR生成项目生成的CSR使用它自己生成的密钥,或者根本没有私钥。这将得到这样的逻辑:你不能从CER或DER中提取私钥,因为它不在那里。
https://stackoverflow.com/questions/39975716
复制相似问题