>source

아래 링크의 19번을 사용하여 우분투 로컬 호스트에 아파치를 설정했습니다. localhost에서 Apache용 HTTPS를 어떻게 허용합니까?설명된 모든 단계를 사용하여 자체 서명된 "mykey.key" 및 "mycert.pem"을 생성하고 "SSLCertificatefile" 및 "SSCertificateKeyFile"로 설정했습니다. 이제 "https://localhost:443"에 연결할 수 있습니다.

하지만 lipcurl c 프로그램을 실행하려고 하면 "curl_easy_perform() 실패: 로컬 SSL 인증서 문제" 오류가 발생합니다.

여기서 동일한 키를 사용하고 있습니다. 위의 단계에서 생성한 인증서:mykey.key & mycert.pem.

int main(void)
{
  CURL *curl;
  CURLcode res;
  FILE *headerfile;
  const char *pPassphrase= NULL;
  static const char *pCertFile= "mycert.pem";
  static const char *pCACertFile= "/usr/local/share/ca-certificates/CACert.crt";
  static const char *pHeaderFile= "dumpit";
  const char *pKeyName;
  const char *pKeyType;
  const char *pEngine;
  headerfile= fopen(pHeaderFile, "wb");
  curl_global_init(CURL_GLOBAL_DEFAULT);
  curl= curl_easy_init();
  if(curl) {
    /* what call to write: */
    curl_easy_setopt(curl, CURLOPT_URL, "https://localhost:443");
    curl_easy_setopt(curl, CURLOPT_HEADERDATA, headerfile);
    do { /* dummy loop, just to break out from */
      if(pEngine) {
        /* use crypto engine */
        if(curl_easy_setopt(curl, CURLOPT_SSLENGINE, pEngine) != CURLE_OK) {
          /* load the crypto engine */
          fprintf(stderr, "cannot set crypto engine\n");
          break;
        }
        if(curl_easy_setopt(curl, CURLOPT_SSLENGINE_DEFAULT, 1L) != CURLE_OK) {
          /* set the crypto engine as default */
          /* only needed for the first time you load
             a engine in a curl object... */
          fprintf(stderr, "cannot set crypto engine as default\n");
          break;
        }
      }
      curl_easy_setopt(curl, CURLOPT_SSLCERTTYPE, "PEM");
      curl_easy_setopt(curl, CURLOPT_SSLCERT, pCertFile);
      curl_easy_setopt(curl, CURLOPT_SSLKEYTYPE, pKeyType);
      curl_easy_setopt(curl, CURLOPT_SSLKEY, pKeyName);
      curl_easy_setopt(curl, CURLOPT_CAINFO, pCACertFile);
      curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
      res= curl_easy_perform(curl);
      if(res != CURLE_OK)
        fprintf(stderr, "curl_easy_perform() failed: %s\n",
                curl_easy_strerror(res));
    } while(0);
    /* always cleanup */
    curl_easy_cleanup(curl);
  }
  curl_global_cleanup();
  return 0;
}

여기 "mycert.pem"의 내용 및 "CACert.crt"는 내가 사본을 만든 것과 동일합니다.

제가 누락된 단계가 있으면 제안해 주세요.

변수 pKeyName, pKeyType, pEngine은 초기화되지 않습니다.

273K2022-01-13 08:21:13

CURLOPT_SSLCERT는 귀하의 질문에 사용하지 않는 클라이언트 인증서용입니다...

Daniel Stenberg2022-01-13 08:21:13

@DanielStenberg 감사합니다. 예, 같은 작업을 하는 동안 이 C 프로그램에 대해 클라이언트 인증서와 클라이언트 개인 키를 사용해야 한다는 것을 알게 되었습니다. 하지만 이 프로그램을 작동시키려면 우분투에서 CA를 구성하고 사용해야 한다고 생각합니다. SSL을 통한 이 클라이언트 서버 통신의 전체 설정을 설정하기 위한 모든 단계가 언급된 좋은 참조를 얻을 수 있는 사람이 있습니까? 큰 도움이 될 것입니다.

Shah2022-01-12 12:51:25
  • 이전 C# 콘솔 앱의 표준 출력을 리디렉션하면 표준 입력도 리디렉션됩니다.
  • 다음 javascript : kill process.exec 기능