C++ Qt :: Https Request

C++ Qt :: Https Request

배진오

@baealex

소비적인 일보단 생산적인 일을 좋아합니다.

간만에 C++ Qt를 다시 잡았다. 학부생때 대강(당시엔 열심히 했다고 느꼈지만) 만들었던 프로그램에 누군가가 스타를 눌러주었는데, 코드가 매우 부끄러운 수준이었고 이를 개선함과 동시에 몇가지 기능을 추가하고 싶었기 때문이다. 추가하는 기능에 네트워크를 사용할 필요가 있었다.

Qt5에서는 QFtp 등등이 사라지고 QNetworkAccessManager로 모든 네트워크 통신을 사용하도록 변경되었다. 학부생인 당시 FTP를 이용하기 위해서 슬쩍 다뤄본 적은 있었는데 당시에 connect와 같은 기능을 제대로 응용하지 못했다. 지금보니 참 쉬운데 왜 응용하지 못했는지 한탄스럽다.


Http Request

QNetworkAccessManager를 이용하여 Http Get 요청을 보내는 코드는 아래와 같다.

QNetworkAccessManager *manager = new QNetworkAccessManager();
connect(manager, &QNetworkAccessManager::finished,
    this, [=](QNetworkReply *reply) {
        if (reply->error()) {
            qDebug() << reply->errorString();
            return;
        }
        QString response = reply->readAll();
        qDebug() << response;
    }
);
manager->get(QNetworkRequest(QUrl("http://blex.me")));

C++에도 람다와 같은 기능이 있는지는 이번에 처음 알았다! 람다와 connect가 만나니 간결하고 명확한 코드처럼 느껴져서 좋았다. 현재 위 URL은 httpsredirect 시키고 있다. 결과는 아주 성공적으로 redirect가 된다는 페이지가 넘어왔다.


Https Request

위에서 주소를 Https로 변경하면 아래와 같은 에러가 발생한다.

TLS initialization failed

여기서 살짝의 멘붕을 겪었는데 생각보다 해결 방법이 어렵지 않았다.

manager = new QNetworkAccessManager();
connect(manager, &QNetworkAccessManager::finished,
    this, [=](QNetworkReply *reply) {
        if (reply->error()) {
            qDebug() << reply->errorString();
            return;
        }
        QString response = reply->readAll();
        qDebug() << response;
    }
);

QSslConfiguration config = QSslConfiguration::defaultConfiguration();
config.setProtocol(QSsl::TlsV1_2);

QNetworkRequest request;
request.setSslConfiguration(config);
request.setUrl(QUrl("https://blex.me"));
manager->get(request);

위와같이 QNetworkRequestSslConfiguration을 설정해 주면된다! 다시 실행해보자.

TLS initialization failed

또 같은 에러가 발생한다... 하... 파이썬이 그립다...


OpenSSL Lib

qDebug() << QSslSocket::supportsSsl() << QSslSocket::sslLibraryBuildVersionString() << QSslSocket::sslLibraryVersionString();

우선 Qt에서 위와같은 SSL 관련 정보를 찍어보자.

false "OpenSSL 1.0.2p  14 Aug 2018" ""

필자의 경우는 위와같은 결과가 출력되었다.

  1. 현재 프로그램에서 SSL 지원 여부
  2. Qt가 빌드될 당시에 사용된 SSL lib의 버전
  3. 현재 프로그램에 등록된 SSL lib의 버전

우리의 프로그램에는 SSL lib를 넣지 않았으므로 우리에게 가장 중요한 정보는 2번이다.

위 사이트로 이동하여 Qt가 빌드될 당시에 사용된 lib 버전을 찾자. 필자의 경우에는 openssl-1.0.2o-x32-VC2017.zip 이 파일을 받았다. 알파벳 버전까지 맞춰야 하는 줄 알았는데 그냥 숫자만 맞춰주면 되는 것 같다. 압축을 해제한 후 dll 파일을 복사하자. 가령 디버그를 하고 있다면 해당 라이브러리를 아래 경로에 넣으면 된다.

D:\GitHub\TextWidget\build-TextWidget-Desktop_Qt_5_12_2_MSVC2017_32bit-Debug\debug

배포인 경우엔 배포파일이 존재하는 경로에 때려 넣으면 된다. 다시 SSL 관련 정보를 찍어보면 아래와 같이 나온다.

true "OpenSSL 1.0.2p  14 Aug 2018" "OpenSSL 1.0.2o  27 Mar 2018"

프로그램에 정상적으로 SSL이 지원되고 있다. 👍

😥 작성된 댓글이 없습니다!
댓글을 작성하기 위해 로그인이 필요합니다.