Italian [B4J] Collegarsi a Webservice con certificati Self-Signed

Teech

Member
Licensed User
Longtime User
Buongiorno a tutti.
Premetto che non sono per nulla esperto di questo genere di comunicazioni, ma sto provando a connettermi ad un WebService messo a disposizione da un software a cui collegarmi.

Sono partito da un esempio che mi hanno fornito in JS ma ancora non riesco a collegarmi, e mi viene restituito il seguente errore:
Mi pare di capire che il problema sia sul fatto che il client (cioè la mia procedura) non accetta i certificati Self-Signedm necessari all'utilizzo del Webservice a cui mi sto connettendo.
Ho provato ad inserire il valore HU2_PUBLIC nei "Conditional Symbol" delle impostazioni di compilazione, ma senza risultati utili.
Il codice che utilizzo è il seguente:
B4X:
    Dim su As StringUtils
    Dim url As String="https://mioindirizzo/webservice"
    Dim dom As String=""
    Dim usr As String=su.EncodeBase64("CREDENZIALI".GetBytes("UTF8"))
    Dim aut As String=$"Auth"$
    If dom.Length>0 Then aut=$"${aut} Dominio ${dom}"$
    Dim j As HttpJob
    j.Initialize("",Me )
    j.PostString(url,usr)
    Wait For(j) JobDone(j As HttpJob)
    If j.Success Then
        Log(j.GetString)
    Else
        Log(j.ErrorMessage)
    End If
    j.GetRequest.SetHeader("Authorization",aut)
    j.GetRequest.SetContentType("application/json")
    j.Release

Potete darmi una indicazione su come procedere? Grazie
 

drgottjr

Expert
Licensed User
Longtime User
devi mostrare essatamente come hai fatto l'autorizzazione. qualcosa non quadra. e devi mettere i set-headers nel luoco giusto, no dopo la richiesta
 

Attachments

  • teech.png
    69.3 KB · Views: 210

Teech

Member
Licensed User
Longtime User
Per gli headers hai perfettamente ragione, li avevo spostati come test (per verificare se l'errore cambiava) e li ho postati erroneamente posizionati: anche mettendoli nella giusta sequenza l'errore non cambia.
La stringa per l'autorizzazione è una costante: il dominio viene richiesto quando ci si deve connettere all'installazione in cloud (non è il mio caso attualmente per cui il dominio è vuoto). Penso sia questo passaggio che non quadra, ma è quanto mi richiedono i produttori del gestionale.

Per completezza allego l'esempio che il produttore del WS mi ha mandato in JS:
JavaScript:
    var url = "https://mioindirizzo/webservice";
    var dom = "";
    var cr = "CREDENZIALI";  
    var cr64 = btoa(cr);
    var auth = "Auth "+cr64+" Dominio="+dom;  
    var req = new XMLHttpRequest();  
    req.onreadystatechange = function() {
        if (this.readyState === 4 && this.status === 200) {
            console.log(req.responseText);  
            alert('err')
        }else{
            console.log(req);
        }
    };  
    req.open("POST", url, true);  
    req.setRequestHeader('Authorization',auth);
    req.setRequestHeader('Content-Type','application/json; charset=utf-8');
Penso che il problema sia riscontrabile nel messaggio:
Il produttore del WS mi dice che è necessario far accettare l'accesdso con certificati Self-Signed: vorrei provare a far accettare certificati self-signed a B4J, ma non trovo indicazioni su come verificare questa modalità.
 

LucaMs

Expert
Licensed User
Longtime User
Il produttore del WS mi dice che è necessario far accettare l'accesdso con certificati Self-Signed: vorrei provare a far accettare certificati self-signed a B4J, ma non trovo indicazioni su come verificare questa modalità.
You are looking for client certificates. It is not supported by jOkHttp.

Con i websocket è possibile aggirare la cosa, facendo accettare al client qualunque certificato. Vediamo se esista altrettanto con OKHttp...
 

Teech

Member
Licensed User
Longtime User
EDIT 10/08/2023 - sempre per completezze di informazione, usando HttpJob si può usare nel menu Build Configuration, inserire nel campo Conditional Symbols il valore HU2_ACCEPTALL
------
Usando OkHttpClient al posto di HttpJob per utilizzare l'inizializzazione con AcceptAll, funziona.
Ammetto di aver visto sul forum la OkHttpClient.InizializeAcceptAll, ma non capivo la differenza fra HttpJob e OkHttpClient, per cui non volevo incastrarmi un un ulteriore problema: provando invece funziona divinamente. A volte intestardirsi non paga
Grazie mille.

Allego codice risolutivo, per completezza:
B4X:
Sub Process_Globals
    Private c As OkHttpClient
End Sub

Sub Button1_Click
    Dim su As StringUtils
    Dim url As String="https://mioindirizzo/webservice"
    Dim usr As String=su.EncodeBase64("CREDENZIALI".GetBytes("UTF8"))
    Dim dom As String=""
    Dim aut As String=$"Auth ${usr}"$
    If dom.Length>0 Then aut=$"${aut} Dominio ${dom}"$
    c.InitializeAcceptAll("client")

    Dim rq As OkHttpRequest
    rq.InitializePost2(url,usr.GetBytes("UTF8"))
    rq.SetContentType("application/json")
    rq.SetHeader("Authorization",aut)
    c.Execute(rq,0)
End Sub

Private Sub client_ResponseError (Response As OkHttpResponse, Reason As String, StatusCode As Int, TaskId As Int)
    Log($"Error: ${StatusCode}
          ${Response.ErrorResponse}"$)
End Sub

Private Sub client_ResponseSuccess (Response As OkHttpResponse, TaskId As Int)
    Log($"Response: ${Response.GetHeaders}"$)
End Sub
 
Last edited:
Cookies are required to use this site. You must accept them to continue using the site. Learn more…