Italian Mysql e SSL

Discussion in 'Italian Forum' started by micro, Jun 5, 2019.

  1. micro

    micro Well-Known Member Licensed User

    Salve ragazzi
    Su Aruba ho un cloud linux sul quale ho installato un server mysql che utilizzo da remoto con alcuni miei programmi (B4J) per archiviare quello che mi serve, diciamo che non sono dati sensibili e quindi il traffico avviene in chiaro però anche se poco importanti (i dati) sto pensando di passare all'uso di SSL.
    Informandomi ho visto che lato server mysql nella cartella mysql devo crearmi una cartella chiamata ssl e all'interno scaricarmi i vari certificati ca-cert.pem - ca-key-pem ecc.
    Lato Client quindi dovrei prepare la stessa cosa con i vari certificati che andranno puntati dalla stringa di connessione a mysql ma quello che non capisco è che certificati usare, quelli che mi ritrovo in mysql/ssl o altro?
    Chiedo quindi se qualcuno di Voi ha già utilizzato questo se riesce a darmi una dritta, anche come procedura corretta di scarico dei certificati e loro utilizzo.
    Grazie.
     
  2. udg

    udg Expert Licensed User

    Considerando che già utilizzi dei tuoi sw B4J per scambiare dati con tue app B4A, perchè non estendere l'utilizzo di SSL/TLS a tutte le comunicazoni tra questi?
    Aggiungi che accedere direttamente al DBMS dall'esterno (fuori dal server) non è mai consigliabile.

    Prima di tutto dovresti procurarti un certificato SSL. Let's Encrypt è una possibilità (a costo zero) ma ha la seccatura di dover rinnovare il certificato ogni tre mesi circa (dico circa perchè si presume che tu rinnovi qualche giorno prima della scadenza). In alternativa ssl2buy.com vende certificati annuali per circa $10. E presumo ce ne siano ormai tanti altri che abbiano più o meno gli stessi costi.

    Le procedure di installazione variano in base a cosa ti invia l'authority da cui hai ricevuto il certificato.
    Lato B4x non c'è molto da fare. Sostanzialmente attivare una porta su JServer (B4J) distinta da quella per il traffico in chiaro ed utilizzare https da B4A quando ti colleghi al tuo servizio B4J.
     
  3. micro

    micro Well-Known Member Licensed User

    Tutto Ok UDG certo ma è il settaggio esatto lato server (cloud) e lato cliente (B4J) che mi spiazza.
    Ad esempio sul cloud linux in /etc ho gia una cartella ssl con altre due subdir
    upload_2019-6-5_17-3-36.png
    In private ho ssl-cert-snakeoil.key
    e in certs una miriade di certificati *.pem
    ----------------------------------------------
    Se apro my.cnf in /etc/mysql
    trovo:

    # For generating SSL certificates I recommend the OpenSSL GUI "tinyca".
    #
    #ssl-ca=/etc/mysql/cacert.pem
    #ssl-cert=/etc/mysql/server-cert.pem
    #ssl-key=/etc/mysql/server-key.pem

    Quindi per usare ssl devo decommentare le ultime tre
    righe ma di quei file pem non ne trovo nessuno in /etc/ssl/certs

    Quindi? (è questo che mi confonde)

    E poi lato B4J come dici tu un qualunque certificato SSL?

    Grazie

    P.S.
    Non voglio fare modifiche al programma e questa modalità di connessione diretta a mysql sul cloud mi è comoda
    altrimenti avrei ovviato all'utilizzo di APi REST o con PHP ma ripeto non ho proprio voglia di stare a modificare il
    programma.
     
  4. udg

    udg Expert Licensed User

    Non saprei di preciso, ma la prima riga di commento sembrerebbe suggerire di utilizzare tinyca per generare quei file. Se ciò fosse confermato, il primo problema (accesso SSL a MySql) dovrebbe risolversi in questo modo.

    Per il discorso B4J, come dicevo nel post precedente, dovresti prima decidere quale certificato acquisire. Questo perchè il materiale che ti arriva differisce da fornitore a fornitore. In funzione di ciò che ricevi è necessario "assemblare" i file ricevuti in modo che JServer li riconosca ed utilizzi. Ti riporto una ricetta di massima nel prossimo post.

    ps: dimenticavo di avvisare che io ho CentOS 7 e non Ubuntu, quindi i comandi potrebebro differire, ma la sostanza dovrebbe rimanere quella.
     
    Last edited: Jun 6, 2019
  5. udg

    udg Expert Licensed User

    Qui di seguito ti riporto i miei appunti di quando ho attivato un certificato Let'sEncrypt come base per lo scambio dati B4A-B4J. Sono solo note raccolte leggendo qua e là, ma dovrebbero essere sufficienti.

    *****************************************************************************
    Key Manager Password: abcdef12pkcs
    Keystore password: abcdef12key
    *****************************************************************************
    NB: le due passwprd precedenti sono esempi generici; utilizza quelle che riteni più opportune, ma ricorda di distinguere bene i ruoli tra KeyManager e Keystore (v. oltre)

    ***** Installa certbot
    sudo apt-get update
    sudo apt-get install software-properties-common
    sudo add-apt-repository ppa:certbot/certbot
    sudo apt-get update
    sudo apt-get install certbot

    sudo certbot certonly --webroot -w /opt/CloudServer/http_public -d mysitehere.com -d www.mysitehere.com

    sudo certbot certonly --standalone -d mysitehere.com -d www.mysitehere.com

    (replaced mysitehere.com with my actual domain name for my website where my B4J app is running.)


    The above created a folder in etc/letsencrypt/live/mysitehere.com/
    In that directory there is a few .pem files.

    **** prepara PKCS12 file ****************
    sudo openssl pkcs12 -export -out keystore.pkcs12 -in /etc/letsencrypt/live/mysitehere.com/fullchain.pem -inkey /etc/letsencrypt/live/mysitehere.com/privkey.pem

    This will have you create a password. This is your "Key Manager" password. It's the password that unlocks your key / certificate. Don't forget / loose this password. It will have you enter it twice.

    ******** prepara il KEYSTORE file ****
    sudo keytool -importkeystore -srckeystore keystore.pkcs12 -srcstoretype PKCS12 -destkeystore keystore.jks

    oppure
    sudo keytool -v -importkeystore -srckeystore domaincert.p12 -srcstoretype PKCS12 -destkeystore keystore.jks -deststoretype JKS

    Note: “keystore.jks” will be the name of the final keystore file. You can change it to whatever you like (I named it “jetty.keystore”).

    1) This will have you set up a password and re-enter the password. This password is your "Key Store" password. This is the password that opens the key store file.

    2) It will then ask you for you password that you used to create the domaincert.p12 file (the "Key Manager" password). The password can be the same for both - if you prefer


    Once this is done, you'll have a keystore file named keystore.jks (or whatever you called it).

    Now, copy this keystore file to the same place as your jserver .jar file.

    ****************** Erel tutorial ***
    https://www.b4x.com/android/forum/threads/server-ssl-connections.40130/#content

    The server configuration is done with SslConfiguration object. This code should be called before the server is stared.
    Code:
    Private Sub ConfigureSSL (SslPort As Int)
       
    'example of SSL connector configuration
       Dim ssl As SslConfiguration
       ssl.Initialize
       ssl.SetKeyStorePath(
    File.DirApp, "test2.keystore"'path to keystore file
       ssl.KeyStorePassword = "123456"
       ssl.KeyManagerPassword = 
    "654321"
       srvr.SetSslConfiguration(ssl, SslPort)
       
    'add filter to redirect all traffic from http to https (optional)
       srvr.AddFilter("/*""HttpsFilter"False)
    End Sub
    We need to create a SslConfiguration object and set the path and passwords of the keystore file.
    Then we call Server.SetSslConfiguration with the configuration object and the https port we want to listen to.

    We can use a Filter class to redirect all http traffic to https:
    Code:
    'Return True to allow the request to proceed.
    Public Sub Filter(req As ServletRequest, resp As ServletResponseAs Boolean
       
    If req.Secure Then
         
    Return True
       
    Else
         resp.SendRedirect(req.FullRequestURI.Replace(
    "http:""https:") _
           .Replace(Main.srvr.Port, Main.srvr.SslPort))
         
    Return False
       
    End If
    End Sub
    This code checks whether the request is a secure request. If not it redirects the request to the https port and sets the scheme to https.

    Note that trying to connect with http to the https port or with https to the http port will result with an error.

    Filters do not apply to web sockets. You can use WebSocket.Secure to make sure that a secure connection has been made (this will be the case if the current request is a https request, unless someone has tampered the JavaScript code).

    udg
     
  6. micro

    micro Well-Known Member Licensed User

    Grazie UDG per la lezione ....SSL
    Ma devo fare mente locale su cosa fare che sia più giusto e corretto, inoltre è un po diversa la mia situazione.
    Vedo un po ed eventualmente ci risentiamo, grazie.
     
  7. udg

    udg Expert Licensed User

    Lezione è un termine decisamente esagerato; diciamo che ho condiviso la mia esperienza avendo affrontato una situazione simile qualche tempo fa.

    Buona serata
     
    Star-Dust likes this.
  8. micro

    micro Well-Known Member Licensed User

    Grazie comunque
    Ho ripreso ieri a fare qualche prova ma ho ancora dubbi
    Riepilogo:
    Sul cloud linux aruba dove ho mysql installato ieri ho installato i certificati usando questa procedura
    (sino all'inserimento di un utente) e sin qui tutto ok.
    Infatti ora al'interno di mysql ho una cartella ssl con
    ca-cert.pem
    server-cert.pem
    server-key.pem

    in my.cnf ho messo i percorsi giusti e ho abilitato il log e già qui un piccolo problema perchè nel log mi ritrovo che per ssl la path dei certificati è errata ma i percorsi però sono quelli.
    Comunque lo vedrò dopo.

    La parte che mi sfugge è il settaggio sul pc con cui mi connetto al cloud

    Quando lavoravo senza ssl avevo:
    Code:
    Try
            pool.Initialize(
    "com.mysql.jdbc.Driver""jdbc:mysql://ip_cloud:3306/name_db""user""pass")
            
    Dim jo As JavaObject = pool
            jo.RunMethod(
    "setMaxIdleTime"Array As Object(3600))
            jo.RunMethod(
    "setMaxPoolSize"Array As Object(200))
            jo.RunMethod(
    "setCheckoutTimeout"Array As Object(3500))
            NotificaShow(
    "Info""Connessione database Ok!""info"2000)
            connessocloud = 
    True
            Inizializza
            CaricaArchivi
            LoadColumn
        
    Catch As Exception
            NotificaShow(
    "Errore""Errore connessione server mysql!""errore"2000)
            connessocloud = 
    False
        
    End Try
    e sin qui tutto ok perchè funzionava bene (dopo ho usato la connessione asincrona ma è altra cosa)
    Ora che ho intenzione di usare ssl (ho installato su win OpenSSl32) la stringa dovrebbe diventare:
    Code:
    pool.Initialize("com.mysql.jdbc.Driver""jdbc:mysql://ip_cloud:3306/name_db?&useSSL=true&serverSSlCert=C:\Program Files (x86)\OpenSSL-Win32\certs\ca-cert.pem""user""pass")
    Dico bene?
    Oppure mi sfugge qualcosa?
    Grazie ancora

    .....provo a postare nel forum inglese (Edit)
     
    Last edited: Jun 7, 2019
Loading...
  1. This site uses cookies to help personalise content, tailor your experience and to keep you logged in if you register.
    By continuing to use this site, you are consenting to our use of cookies.
    Dismiss Notice