我正在开发一个使用第三方框架和SSL的iOS应用。
为了连接到服务器,我需要通过服务器证书,客户端证书和密码:
[HostConfiguration hostConfigurationWithAddress:@"demo.server...."
port:743
securedWithSSL:YES
serverCertPath:[[NSBundle mainBundle] pathForResource:@"SERVER-CERT" ofType:@"der"]
clientCertChainPath:[[NSBundle mainBundle] pathForResource:@"CLIENT-CERT" ofType:@"p12"]
chainPassphrase:@"ABCDEFG"];
因此,我要求其支持下的证书进行连接,并且他们向我发送了一个zip文件(我使用的是Mac):
chain_2016.pem(mac标识为“根”)
密码短语
yourCertificate.pem(“标准”)
yourCertificate.p12(“个人”)
密码短语文件包含两个字符串,p12文件的密码短语和32个字符长的字符串,但我不知道它的用途。看起来像这样:53CFE0E1914EF853E148F29C0A56B716
我知道p12文件和密码短语是正确的,但是令我感到困惑的是两个PEM文件,我只需要一个DER编码的证书。我尝试使用以下方法将每个PEM转换为DER
openssl x509 -in ...
但这没有用...
我打印了
chain_2016
和yourCertificate.pem
的内容,并注意到yourCertificate.pem
包含chain_2016
加上两个额外的证书。链_2016.pem
cat chain_2016.pem
-----BEGIN CERTIFICATE-----
MIIERTCCAy2gAwIBAgIINQskOyELGawwDQYJKoZIhvcNAQEFBQAwga8xHjAcBgkq
[...]
VPEpWKH17rzBvmktsDjqo1Zch8xiWSzP0DnJJw13Zn/cPwBJkHY0LPA=
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIFSzCCBDOgAwIBAgIIPuhYaSjrBR8wDQYJKoZIhvcNAQEFBQAwga8xHjAcBgkq
[...]
ZeitvrwyCtzVo7NWb+Zf
-----END CERTIFICATE-----
yourCertificate.pem
cat yourCertificate.pem
Bag Attributes
localKeyID: 2E EC 57 1C 31 82 6D 82 68 59 86 93 FB FA 65 16 58 85 21 22
friendlyName: myApp.test.client
Key Attributes: <No Attributes>
-----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCu9UVuZyLsOc5u
[...]
zoQQfIreqU9KN4nhmZLKR0zY
-----END PRIVATE KEY-----
Bag Attributes
localKeyID: 2E EC 57 1C 31 82 6D 82 68 59 86 93 FB FA 65 16 58 85 21 22
friendlyName: myApp.test.client
...Here some other info like subject/email etc...
-----BEGIN CERTIFICATE-----
MIIHljCCBX6gAwIBAgIIETxy2amJI0cwDQYJKoZIhvcNAQENBQAwgbUxHjAcBgkq
[...]
hdAq5P+vcHfD8cGOdI61yJB2PgJg67lWviU=
-----END CERTIFICATE-----
Bag Attributes
friendlyName: CompanyName Meta ROOT CA TEST
...Again some other info like subject/email etc...
-----BEGIN CERTIFICATE-----
MIIERTCCAy2gAwIBAgIINQskOyELGawwDQYJKoZIhvcNAQEFBQAwga8xHjAcBgkq
[This is the same as one of the certificates in chain_2016]
VPEpWKH17rzBvmktsDjqo1Zch8xiWSzP0DnJJw13Zn/cPwBJkHY0LPA=
-----END CERTIFICATE-----
Bag Attributes
friendlyName: CompanyName SUB TEST ROOT CA 1
...Again some other info like subject/email etc...
-----BEGIN CERTIFICATE-----
MIIFSzCCBDOgAwIBAgIIPuhYaSjrBR8wDQYJKoZIhvcNAQEFBQAwga8xHjAcBgkq
[Second certificate in chain_2016]
ZeitvrwyCtzVo7NWb+Zf
-----END CERTIFICATE-----
由于这是我第一次使用SSL,因此我希望有人可以帮助我。
谢谢 !
更新:
谢谢pedrofb,正如我所说,我已经尝试过:
我尝试使用以下方法将每个PEM转换为DER
openssl x509 -in ...
但这没有用...
使用此框架有两个步骤。首先,建立与服务器的连接,然后执行操作。使用转换后的DER文件中的任何一个,我都可以连接,但是当我尝试执行某项操作(例如登录)时,我得到“您无权执行此操作”。这是否意味着证书一切正常,并且错误来自与SSL无关的其他地方?
最佳答案
看来您正在执行双向SSL。你需要:
在握手期间添加到信任库并进行验证的服务器证书路径。大概是chain_2016.pem
握手期间要出示的客户证书。 yourCertificate.p12和密码短语
一个PEM文件可以包含多个证书和/或私钥。它们由----- BEGIN -----
-----END -----
标头分隔。
他们可能在yourCertificate.pem
和yourCertificate.p12
中发送了相同的信息,只是更改了格式,并且密码在第一种情况下对应于私钥,在第二种情况下对应于p12文件的密码。您可以使用GUI工具KeyStoreExplorer或openssl轻松检查.p12文件的内容
DER是一种二进制格式,用于对证书进行编码。 PEM是转换为base64并添加标头的DER文件。要将PEM转换为DER,请使用openssl(请参见this)
openssl x509 -in chain_2016.pem -outform der -out chain_2016.der
因此,总而言之,检查您的文档,我认为您需要
serverCertPath: chain_2016.der
clientCertChainPath: yourcertificate.p12
chainPassphrase: theP12Passphrase
关于ssl - 与PEM和DER证书混淆,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38703470/