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: 275

vpires

Member
Licensed User
Longtime User
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,

B4X:
#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
Top