Android Question Connect the rest api with a client certificate

Stephanie lie

Member
Licensed User
I have a bottleneck to connect to someone else's api but the connection must be with a client certificate, I need it for the my project pleas. This setting screenshoot in Postman
 

Attachments

  • sc1.png
    sc1.png
    87.9 KB · Views: 643
If you know java, this should give you some help.
It's some code extracted from one lib that i've done and seems to accept the certificate.

At least i get a 404 (accepted, not found). Without it, you get a 403 (forbidden). Without more details, there's no way to know the api endpoints and expected parameters,

Code:
#Region  Project Attributes
    #ApplicationLabel: B4A Example
    #VersionCode: 1
    #VersionName:
    'SupportedOrientations possible values: unspecified, landscape or portrait.
    #SupportedOrientations: unspecified
    #CanInstallToExternalStorage: False
#End Region

#Region  Activity Attributes
    #FullScreen: False
    #IncludeTitle: True
#End Region

Sub Process_Globals
    'These global variables will be declared once when the application starts.
    'These variables can be accessed from all modules.

    Dim endPoint As String = "https://api.kaspro.id/d5zWSiy5RC"
End Sub

Sub Globals
    'These global variables will be redeclared each time the activity is created.
    'These variables can only be accessed from this module.

End Sub

Sub Activity_Create(FirstTime As Boolean)
    'Do not forget to load the layout file created with the visual designer. For example:
    'Activity.LoadLayout("Layout1")
    
    Dim cert As String=$"-----BEGIN CERTIFICATE-----
MIIDpTCCAo0CBF14sw4wDQYJKoZIhvcNAQELBQAwgZYxIzAhBgkqhkiG9w0BCQEW
FGRrYXBzdGVyMDFAZ21haWwuY29tMQswCQYDVQQGEwJJRDEQMA4GA1UECAwHSmFr
YXJ0YTEQMA4GA1UEBwwHSmFrYXJ0YTEeMBwGA1UECgwVRGlnaSBQZXNvbmEgSW5k
b25lc2lhMQswCQYDVQQLDAJJVDERMA8GA1UEAwwIZGthcHN0ZXIwHhcNMTkwOTEx
MDg0MDQ2WhcNMjAwOTExMDg0MDQ2WjCBljEjMCEGCSqGSIb3DQEJARYUZGthcHN0
ZXIwMUBnbWFpbC5jb20xCzAJBgNVBAYTAklEMRAwDgYDVQQIDAdKYWthcnRhMRAw
DgYDVQQHDAdKYWthcnRhMR4wHAYDVQQKDBVEaWdpIFBlc29uYSBJbmRvbmVzaWEx
CzAJBgNVBAsMAklUMREwDwYDVQQDDAhka2Fwc3RlcjCCASIwDQYJKoZIhvcNAQEB
BQADggEPADCCAQoCggEBAK5wStrcZtQJ1OhTEh+VwjWwig+Sh7MUy9ftYeqmByhE
0Jie0CC9O6GBAxaeKrmfA8an0DHlLEZnfEHT3KNmYbImKIZq98eXUJTxkCyCj0nq
fBgwwzx0Vvn4C31sR4EsKXL1sw46Pfba+RaEXWVad4Ogb8Dyje/rxjEjoQKBCdkO
9G5SvZuJwCkXVilbY1RpCrQwae2gtdKNF+nJsS3qlQvyS1dZUmBfPKiOyTyUnSfs
eoqkt/V0jEs01mJt+HbETgrBGMOQBjBVSIltZtqCQsk9GkcNz2p5RLNK3awiJnIl
s+6OQT4xn5FKoneT/W7zuJEuQyJo6M9/jsUNZvNvvVECAwEAATANBgkqhkiG9w0B
AQsFAAOCAQEAC3qYISHhD94ZL4Uog1k0bPtdr9tjWaKt70eiYxS7ES4ec30Agqwj
mjckp3FgBw7K7xnEEWF2MpkIcsf0VytVyexdowzazGvFcdbkUON4UyPhxpPoX1bO
kSWY8tZFE0Ao/GDOva9XvhAYNfmZ2aySWvcqk4ZioUXTXZwbHK5vfhzw797jxLoU
B+9blr9/OlBhdfKa3qlN/DU3Wzh3wp35r4ocAedbrcNq+eizH+/HZB/nnoSuk4++
lGiIrQ72c2PTvHfBUacAuLwGC0MjGMAa+Jbuud4KcFxDfIWZDOkA38K6dI6DmmpI
kRaTiPf8z+XHe6ehD2Ij2REg15RE0uAuxw==
-----END CERTIFICATE-----"$

    Dim pk As String=$"MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCucEra3GbUCdTo
UxIflcI1sIoPkoezFMvX7WHqpgcoRNCYntAgvTuhgQMWniq5nwPGp9Ax5SxGZ3xB
09yjZmGyJiiGavfHl1CU8ZAsgo9J6nwYMMM8dFb5+At9bEeBLCly9bMOOj322vkW
hF1lWneDoG/A8o3v68YxI6ECgQnZDvRuUr2bicApF1YpW2NUaQq0MGntoLXSjRfp
ybEt6pUL8ktXWVJgXzyojsk8lJ0n7HqKpLf1dIxLNNZibfh2xE4KwRjDkAYwVUiJ
bWbagkLJPRpHDc9qeUSzSt2sIiZyJbPujkE+MZ+RSqJ3k/1u87iRLkMiaOjPf47F
DWbzb71RAgMBAAECggEADnAz+e6RQk64BSzPDLc4FnqQyt4thjib8LjwyFvKrt4X
R/KpNnSDSYhkqYwY7DlJtjkwpdiatA8fvVEca5fvUTAQXaPf83DGVjWyYcTCuHME
p3ntxwS4KEOMK+r49iuiGKZWlkBi3ZpdUKxPELMOvmHariVFc0zYIDwbORpWJtWP
jjUs7MoOk9bPWujsYMfILcKiT3UCHEd2oxYCl80ppSddt/4kIJwOpAjsKHtNZJqi
m+S8qu5jMBRjtnJqTHjEINGtmJUGJfvmS3I5jyxnyB424DTE66hclGnKxZcXKRz6
0gYldnTnm6XbAJhNrJ0rZQqUa1ZZy7SRpF0wS+5eGwKBgQDY6856IgzFgHwA5f7O
dAmHt6JHGsfDm6220gcae9tHnHFEPhB/prQa2qnb4I4S4tXaoBB2eFBzfz8rVdqD
xVw2GvDwsUMGsCOssHTsN9wcQ0iXvOEmP3+Pv24WhLzDsJWNqACxciuBdYj509Ft
wyTP7qGlO0X4h0pAzwkrg9fzswKBgQDN3TwfU3+aylTpWGWO66UNi0bMzz7ncNKL
8SYodf6HHUrzQroOyl2/MIZ18P43ZyMS2q6oVrMQNYcCe39vLT0eijEGVvAQRxBl
KGVgluZJzJR+1r0dDfAvqm+KU8mu6p1X2hq3q6HIGJ6ucmGjGFYqDvohdUUZqv17
aUtMNRzY6wKBgG6VeANnTF97KrxCg+231gvsH7xj+KbNvHdRBvIHZjhRlqSVh0+s
KnDuPF2tUoBqR19W7k2W9FyM6CUtdWJrwKCMh3wMwgCs1uL4agLqTznRSzafwaAA
CwW7L2IndRvF79fxZ7kOXQN4acYCp+du7ltaaemUGA2k2sPDSAd5BSRlAoGAGpvp
BIePa9uRRCQX5HRS/kAtY5W6JMIxhMMj0oEF6EMCCBVs5TKFEYxdJOuEgHbFUs+P
WdTzCjpQ/CIoY59uUf88vPwJxaDZ3qltCSIYHBvkacyp3xKJJDAcgL25yPEsa0mW
wHzfyXRdNmE0e5dOs9sBu8djqiCu6P/AKtaGpwcCgYAjJtpCz0qk9ABglIb/GPnA
xMsnXoIokMYvPp9/j4Zma9y6eJ+EWssqxAjaqN/DCct81Jf/rzpSZl8gkTv3aLvR
AXYKkqhkDx144CiqheytuTpFnrnk4xk6fqdaN0aPEHchyfKRk9vxinD+v8PeD+fa
H6Nxy/DqJlEehup82MxdXw=="$
    
    
    
    Dim job As HttpJob
    
    DisableStrictMode
    
    job.Initialize("j",Me)
    
    Dim jo As JavaObject
    jo.InitializeContext
    jo.RunMethod("SetCertificate",Array(cert,pk))
    
        
End Sub

Sub Activity_Resume

End Sub

Sub Activity_Pause (UserClosed As Boolean)

End Sub

Sub DisableStrictMode
    Dim jo As JavaObject
    jo.InitializeStatic("android.os.Build.VERSION")
    If jo.GetField("SDK_INT") > 9 Then
        Dim policy As JavaObject
        policy = policy.InitializeNewInstance("android.os.StrictMode.ThreadPolicy.Builder", Null)
        policy = policy.RunMethodJO("permitAll", Null).RunMethodJO("build", Null)
        Dim sm As JavaObject
        sm.InitializeStatic("android.os.StrictMode").RunMethod("setThreadPolicy", Array(policy))
    End If
End Sub


#if java

    import android.content.Context;
    import java.io.IOException;
    import java.io.InputStream;   
    import java.io.FileInputStream;   
    import java.security.GeneralSecurityException;
    import java.security.KeyStore;
    import java.security.cert.Certificate;
    import java.security.cert.CertificateFactory;
    import java.util.Arrays;
    import java.util.Collection;
    import javax.net.ssl.KeyManagerFactory;
    import javax.net.ssl.KeyManager;
    import javax.net.ssl.SSLContext;
    import javax.net.ssl.SSLSocketFactory;
    import javax.net.ssl.TrustManager;
    import javax.net.ssl.TrustManagerFactory;
    import javax.net.ssl.X509TrustManager;
    import java.security.cert.X509Certificate;
    import java.security.spec.PKCS8EncodedKeySpec;
    import java.security.KeyFactory;
    import java.security.PrivateKey;
    import java.io.ByteArrayInputStream;
    import javax.net.ssl.SSLContext;
    import android.util.Base64;

    import java.io.FileNotFoundException;
    import okhttp3.OkHttpClient;
    import okhttp3.OkHttpClient.Builder;
    import okhttp3.Request;
    import okhttp3.RequestBody;
    import okhttp3.Response;
    import okhttp3.ResponseBody;
    


    public void SetCertificate(String certificate, String pk) throws
        GeneralSecurityException, FileNotFoundException, IOException
        {
        KeyStore ks;
        
        
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
            
        PKCS8EncodedKeySpec privateKeySpec = new PKCS8EncodedKeySpec(Base64.decode(pk,Base64.DEFAULT));
        PrivateKey privateKey = keyFactory.generatePrivate(privateKeySpec);
        
        CertificateFactory fact = CertificateFactory.getInstance("X.509");
        X509Certificate cert = (X509Certificate) fact.generateCertificate(new ByteArrayInputStream(certificate.getBytes()));
        
        ks = KeyStore.getInstance("PKCS12");
        ks.load(null, null);
        ks.setKeyEntry("myClientCert", privateKey, "".toCharArray(), new X509Certificate[] {cert});
        
        KeyManagerFactory kmf = KeyManagerFactory.getInstance("X509");
        kmf.init(ks, "".toCharArray());
        KeyManager[] keyManagers = kmf.getKeyManagers();
        SSLContext sslContext = SSLContext.getInstance("TLS");
        sslContext.init(keyManagers, null, null);
        
        OkHttpClient client = new OkHttpClient();
        OkHttpClient.Builder builder = new OkHttpClient.Builder();
        builder.sslSocketFactory(sslContext.getSocketFactory());
        client = builder.build();
        Response response = client.newCall(new Request.Builder().get()
                            .url(_endpoint)
                            .build()
                ).execute();
                
        BA.Log("body : " + response.body().string());   
        BA.Log("code : " + response.code());   
        
    }

#End If
 
Upvote 0
Back
Top