Ubuntu Suomen keskustelualueet

Ubuntun käyttö => Ohjelmointi, palvelimet ja muu edistyneempi käyttö => Aiheen aloitti: teele - 13.03.20 - klo:21.08

Otsikko: [ ratkaistu ] cpp-httplib ja https-sivun muuttjien päivitys
Kirjoitti: teele - 13.03.20 - klo:21.08

Toisen keskustelusäikeen prusteella cpp-httplib vaikuttaa  tutustumisen arvoiselta vaihtoehdolta oman pilvessä olevan php-sivun muuttjien arvojen päivitämissä. Se on kokonaan h-tiedostossa, joka vain sisällytetään omaan ohjelmaan ja se on mit-luvallista julkista koodia.

Hankala puoli asiassa on, että tutoriaali- tai ohjeet -haulla ei netistä näytä löytyvän ohjetta, miten pitäisi menetellä, jos haluaa lähettää  uudet parametriarvot 443-portin kautta le-salatulle sivulle.

Tavalliselle http-sivulle muuttujien x ja y arvot voi laittaa c++:ssa vaikka tällaisen pyynnön avulla, joka vain lähetetään soketille.

Koodia: [Valitse]
std::string rq;
rq = rq + "POST /pilvihakemisto/pilvisivu.php HTTP/1.1\r\n" +
           "Host: pilviosoite\r\n" +
           "Content-Type: application/x-www-form-urlencoded\r\n" +
           "Content-Length: 12\r\n" +
           "Connection: close\r\n\r\n" +
           "x=1111&y=222222";

Sivulla

 https://github.com/yhirose/cpp-httplib/blob/master/README.md  (https://github.com/yhirose/cpp-httplib/blob/master/README.md)

on esimerkki

Koodia: [Valitse]
res = cli.Post("/person", "name=john1&note=coder", "application/x-www-form-urlencoded");

mutta mistä löytää porttinumeron.

ssl-ohjeena sivulla on

Koodia: [Valitse]

#define CPPHTTPLIB_OPENSSL_SUPPORT

SSLServer svr("./cert.pem", "./key.pem");

SSLClient cli("localhost", 8080);
cli.set_ca_cert_path("./ca-bundle.crt");
cli.enable_server_certificate_verification(true);


Eli ainakin palvelin ja porttinumero pitänee laittaa sopiviksi, samoin varmaan pitää tietää palvelimella olevan le-salausavaimen tiedoston sijainti.

Tarkoitus olisi saada https-sivun parametreille uudet arvot, kun sivu on pilevessä ja muutokset halutaan omalta kotikoneelta c++ -ohjelmalla.

Vaikka httplib on avointa koodia, se on kuiteinkin 4820 rivin mittainen ohjelma eikä sen käytön selvittäminen lähdetekstiä lukemalla taida olla ihan pikku juttu, jos sei ole aikaisemmin tutustunut http-asiohin.

Ehkä jossain olisi kokonaisia ohjelmaesimerkkejä, mutta ainakaan vielä niitä ei ole löytynyt.


Otsikko: Vs: cpp-httplib ja https-sivun muuttjien päivitys
Kirjoitti: nm - 14.03.20 - klo:12.34
Yhdistä käyttöohjeen kohdat:
https://github.com/yhirose/cpp-httplib#client-example
https://github.com/yhirose/cpp-httplib#post-with-parameters
https://github.com/yhirose/cpp-httplib#openssl-support

Koodia: [Valitse]
#include <iostream>

#define CPPHTTPLIB_OPENSSL_SUPPORT
#include <httplib.h>

int main(void)
{
  httplib::SSLClient cli("oma.pilvidomain.org", 443);
  cli.enable_server_certificate_verification(true);

  httplib::Params params;
  params.emplace("x", "1111");
  params.emplace("y", "222222");

  auto res = cli.Post("/pilvihakemisto/pilvisivu.php", params);

  std::cout << "Status: " << res->status << std::endl;
}
Otsikko: Vs: cpp-httplib ja https-sivun muuttjien päivitys
Kirjoitti: teele - 18.03.20 - klo:21.15

Edellä olevan ohjelman käännöksessä tuli virheilmoitus, httplib.h :ssa olevia liitettäviä tiedostoja ei löydy, ilmeisesti rivit noin 152 - 156 httplib.h -tiedostossa.

Koodia: [Valitse]
#ifdef CPPHTTPLIB_OPENSSL_SUPPORT
#include <openssl/err.h>
#include <openssl/md5.h>
#include <openssl/ssl.h>
#include <openssl/x509v3.h>


Koodia: [Valitse]
httplib.h:153:10: fatal error: openssl/err.h: No such file or directory
 #include <openssl/err.h>
          ^~~~~~~~~~~~~~~
compilation terminated.

Koneessa on Ubuntu 18.04 ja openssl on paikoillaan

Koodia: [Valitse]
openssl version -a
OpenSSL 1.1.1  11 Sep 2018
built on: Tue Nov 12 16:58:35 2019 UTC
platform: debian-amd64

Pitäisikö käännöskomentoon lisätä joku lisävalinta tavallisten lisäksi

Koodia: [Valitse]
g++ koe01a.cpp -o koe01a -Wall -pedantic -L/usr/local/lib  -pthread -std=c++17

Otsikko: Vs: cpp-httplib ja https-sivun muuttjien päivitys
Kirjoitti: nm - 18.03.20 - klo:21.55
Koodia: [Valitse]
httplib.h:153:10: fatal error: openssl/err.h: No such file or directory

Asenna libssl-dev:

Koodia: [Valitse]
sudo apt install libssl-dev

Pitäisikö käännöskomentoon lisätä joku lisävalinta tavallisten lisäksi

Koodia: [Valitse]
g++ koe01a.cpp -o koe01a -Wall -pedantic -L/usr/local/lib  -pthread -std=c++17

Joo, tarvitset kirjastot libssl ja libcrypto:

Koodia: [Valitse]
g++ koe01a.cpp -o koe01a -Wall -pedantic -L/usr/local/lib  -pthread -std=c++17 -lssl -lcrypto
Otsikko: Vs: cpp-httplib ja https-sivun muuttjien päivitys
Kirjoitti: teele - 19.03.20 - klo:10.57
Homma edistyi, mutta ohjelman

Koodia: [Valitse]
#include <iostream>
#define CPPHTTPLIB_OPENSSL_SUPPORT
#include "/home/oma/Documents/my_httplib/cpp-httplib-master/httplib.h"

int main(void)
{
  httplib::SSLClient cli("evvk.dy.fi", 443);
  cli.enable_server_certificate_verification(true);

  httplib::Params params;
  params.emplace("x", "1111");
  params.emplace("y", "222222");

  auto res = cli.Post("/testihakemisto/sf02.php", params);

  std::cout << "Status: " << res->status << std::endl;
}

// cd /home/oma/Documents/my_evvk/   eli ohjelman paikka omalla koneella

// g++ koe02.cpp -o koe02 -Wall -pedantic -L/usr/local/lib  -pthread -std=c++17  -lssl -lcrypto

ajossa

Koodia: [Valitse]
g++ koe02.cpp -o koe02 -Wall -pedantic -L/usr/local/lib  -pthread -std=c++17  -lssl -lcrypto

tulee tällainen virhe

Koodia: [Valitse]
./koe02
Segmentation fault (core dumped)

Virheilmoitusta ei tule, jos kommentoi pois viimeisen cout -tulostuksen, mutta missään tapauksessa palvelimella olevan sivun parametrit eivät näytä muuttuvan.

Palvelinsivu näyttäisi olevan muuten kunnossa ja se näkyy https -muotoisena

Koodia: [Valitse]
https://evvk.dy.fi/testihakemisto/sf01.php

Eli apachella oleva sf02.php -skripti näyttää palauttavan jotain sellaista, joka sotkee ohejlman auto -määritellyn res -arvon.

Tavallisena http -sivuna socket POSTilla sf02.php on kuitenkin toiminut. Miten voisi alkaa jäljittää ongelmaa.

Yksi ero on ainakin httplibin include -rivi ihan alussa. En saanut muotoa <httplib.h> kääntymään ja jouduin laittamaan suoran sijainnin sen tilalle. Voisiko tämä olla syynä.
Otsikko: Vs: cpp-httplib ja https-sivun muuttjien päivitys
Kirjoitti: nm - 19.03.20 - klo:12.22
Yksi ero on ainakin httplibin include -rivi ihan alussa. En saanut muotoa <httplib.h> kääntymään ja jouduin laittamaan suoran sijainnin sen tilalle. Voisiko tämä olla syynä.

Tuo ei ole syynä ongelmaan, mutta voisi olla siistimpää kopioida httplib.h samaan hakemistoon koe02.cpp:n kanssa. Tai edes sen alihakemistoon, jolloin voit viitata tiedostoon absoluuttisen polun sijaan suhteellisesti tyyliin #include "cpp-httplib/httplib.h"


Varsinainen ongelma johtuu siitä, että cli.enable_server_certificate_verification eli palvelimen sertifikaatin varmentaminen vaatii näemmä järjestelmän sertifikaattipolun asettamisen. Polku on erilainen eri käyttöjärjestelmissä ja eri Linux-jakeluissakin. En tiedä miten se selvitetään Windowsissa tai macOS:ssä, mutta Linuxissa tämän pitäisi toimia yleisesti:

Koodia: [Valitse]
  const char *cert_dir = getenv(X509_get_default_cert_dir_env());
  if (!cert_dir) cert_dir = X509_get_default_cert_dir();
  std::string cert_path = cert_dir;
  cert_path += "/ca-certificates.crt";
  std::cout << "Certificate path: " << cert_path << std::endl;

Eli koko ohjelma olisi tällainen:

Koodia: [Valitse]
#include <iostream>
#define CPPHTTPLIB_OPENSSL_SUPPORT
#include "httplib.h"

int main(void)
{
  const char *cert_dir = getenv(X509_get_default_cert_dir_env());
  if (!cert_dir) cert_dir = X509_get_default_cert_dir();
  std::string cert_path = cert_dir;
  cert_path += "/ca-certificates.crt";
  std::cout << "SSL certificate path: " << cert_path << std::endl;

  httplib::SSLClient cli("evvk.dy.fi", 443);
  cli.set_ca_cert_path(cert_path.c_str());
  cli.enable_server_certificate_verification(true);

  httplib::Params params;
  params.emplace("x", "1111");
  params.emplace("y", "222222");

  auto res = cli.Post("/testihakemisto/sf02.php", params);

  if (res) {
      std::cout << "Status: " << res->status << std::endl;
  } else {
      std::cout << "POST failed" << std::endl;
  }
}

Ehkä tulevaisuudessa cpp-httplib osaa kaivaa tuon sertifikaattipolun itsekin. Sellainen ainakin tuntuisi järkevältä oletusasetukselta.

On myös mahdollista kytkeä palvelimen sertifikaatin validointi pois päältä, mutta tietoturvan kannalta tämä ei yleensä ole suositeltavaa:

Koodia: [Valitse]
cli.enable_server_certificate_verification(false);
Otsikko: Vs: cpp-httplib ja https-sivun muuttjien päivitys
Kirjoitti: teele - 19.03.20 - klo:16.51

Katsoin varmennepolun palvelimelta nanolla. Siellä on varmenteen näköistä tekstiä eli polku on kunnossa.

Mutta ohjelman res -muuttuja ei ole vieläkään salli status -tulostusta.

Varmistin selaimella, että domainin https -muoto todella toimii

Koodia: [Valitse]
https://evvk.dy.fi/testihakemisto/testidata.teksti

ja scripti sf02.php palvelimella on toiminut salaamattoman yhteyden kanssa.

Millaisia keinoja olisi selvittää, miksi cliPost ei saa hyväksyttävää arvoa palvelimen php -scriptiltä eikä parametrien muutos onnistu.

Otsikko: Vs: cpp-httplib ja https-sivun muuttjien päivitys
Kirjoitti: nm - 19.03.20 - klo:17.00
Millaisia keinoja olisi selvittää, miksi cliPost ei saa hyväksyttävää arvoa palvelimen php -scriptiltä eikä parametrien muutos onnistu.

Silloin kun cli.Post palauttaa nullin, pyyntö ei lähde lainkaan liikkeelle, vaan vika on SSL-kirjaston tai cpp-httplibin parametreissa.


Minulla edellisen viestini ohjelma toimii kyllä palvelimesi kanssa:

Koodia: [Valitse]
./koe02
Lainaus
SSL certificate path: /usr/lib/ssl/certs/ca-certificates.crt
Status: 200

Toimiiko, jos kytket validoinnin pois päältä:

Koodia: [Valitse]
// cli.set_ca_cert_path(cert_path.c_str());
cli.enable_server_certificate_verification(false);
Otsikko: Vs: cpp-httplib ja https-sivun muuttjien päivitys
Kirjoitti: teele - 19.03.20 - klo:17.04
Ups, tein kirjoitusvirheen ohjelmassa, olin juuri laittamasta muokkausta edlliseen viestiini, mutta ehdit ensin....

Toimii luultavasti täälläki, mutta katson vielä, miten muuttujille palvelimella kävi.

Pahoittelen sähläystäni .....

MUOK.

Myös muttujien arvot vaihtuvat palvelimella, kaikki näyttää toimivan

Kiitos taas kerran  :)