I am new to android. I have written code for ios and want similar algo in android.
Here is the scene. I have 2 types of servers- 1. with self signed cert 2. with signed cert.
Now in ios I use following steps to decide whether it is signed or not.
STACK_OF(X509) *stX509Certificate = SSL_get_peer_cert_chain(ssl); int cert_num = sk_X509_num(stX509Certificate);
CFMutableArrayRef certArray = CFArrayCreateMutable(NULL, cert_num, NULL);
for (int i = 0; i < cert_num; i++) {
unsigned char *raw = NULL;
X509 *x509Certificate = sk_X509_value(stX509Certificate, i);
int rawlen = i2d_X509(x509Certificate, &raw);
CFDataRef cfcert = CFDataCreate(NULL, raw, rawlen);
free(raw);
SecCertificateRef secCertRef = SecCertificateCreateWithData(NULL, cfcert);
CFRelease(cfcert);
CFArrayAppendValue(certArray, secCertRef);
}
CFStringRef servAddr = CFStringCreateWithCString(NULL, [[srvSplit objectAtIndex:0] cStringUsingEncoding:NSUTF8StringEncoding], kCFStringEncodingUTF8);
SecPolicyRef secPolRef = SecPolicyCreateSSL(YES, servAddr);
CFRelease(servAddr);
SecTrustRef secTruRef ;
SecTrustResultType secTrustRes;
Boolean isCertTrusted = NO;
if(SecTrustCreateWithCertificates(certArray, secPolRef, &secTruRef) == errSecSuccess) {
SecTrustSetAnchorCertificatesOnly(secTruRef, NO);
if (SecTrustEvaluate(secTruRef,&secTrustRes) == errSecSuccess) {
switch (secTrustRes) {
case kSecTrustResultInvalid:
case kSecTrustResultDeny:
case kSecTrustResultRecoverableTrustFailure:
case kSecTrustResultFatalTrustFailure:
case kSecTrustResultOtherError:
isCertTrusted = NO;
break;
case kSecTrustResultUnspecified:
case kSecTrustResultProceed:
isCertTrusted = YES;
break;
}
}
}
In android I cant find such TrustEvaluate
method. I tried getBasicConstraints
and getKeyUsage
. But I cant distinguish between signed and other certs.
Please help me.