>source

CERT와 개인 키 파일이 있습니다. cUrl과 PHP를 사용하여 다른 서비스에 연결하고 있습니다. 현재 저는 파일에 인증서와 키를 입력했으며 다음 code에서 완벽하게 작동합니다.

$pemfile= "cert.pem";
$keyfile= "private_key.key";
$url= "someTestUrl";
$requestXml= "requestData";
$ch= curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_VERBOSE, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 1);
curl_setopt($ch, CURLOPT_FAILONERROR, 1);
curl_setopt($ch, CURLOPT_SSLCERT, $pemfile);
curl_setopt($ch, CURLOPT_SSLCERTTYPE, 'PEM');
curl_setopt($ch, CURLOPT_SSLKEY, $keyfile);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: text/xml'));
curl_setopt($ch, CURLOPT_POSTFIELDS, $requestXml);
$ret= curl_exec($ch);

제 질문은 인증서와 키를 파일로 전달하는 대신 문자열로 전달할 수 있습니까? 다음과 같은 문자열로 각 파일의 내용을 단순히 전달하려고 했습니다.

$pemfile= "-----BEGIN CERTIFICATE-----CERTDATAASSTRING-----END CERTIFICATE-----";
$keyfile= "-----BEGIN RSA PRIVATE KEY-----PRIVATEKEYINCODE-----END RSA PRIVATE KEY-----";

... 말할 필요도 없이... 작동하지 않았습니다 :(

아이디어가 있습니까? 포인터? 제안???

어떤 .key 파일을 제공하는지 물어봐도 될까요? .pem 파일만 있습니다.

giannis christofakis2022-01-13 08:33:13
  • 답변 # 1

    그 대답은 불행히도 간단하지만 간단합니다. 아니요, 불가능합니다.

    기본 libcurl에는 실제로 메모리에서 직접 키와 인증서를 제공하기 위한 API가 있지만 PHP/CURL 확장은 파일로 제공하는 것만 지원합니다!

    보너스 자료:

    libcurl이 OpenSSL로 빌드되었다고 확실한경우 실제로 옵션을 사용하여 빌드할 수 있습니다. 하지만:

    1. libcurl+OpenSSL 전용 솔루션이 됩니다.

    2. PHP/CURL이 이 기능을 허용하기에 충분하다고 생각하지 않습니다. 아마도 먼저 바인딩 code를 확장해야 할 것입니다...

    (내가 libcurl의 주요 작성자이자 유지 관리자임을 추가해야 합니다.)

    PHP에서 지원하는 특수 파일 이름이 있으며 그 중 하나는 php://memory 스트림입니다. libcurl은 이러한 파일 이름을 지원합니까? (검증되지 않은)

    lisachenko2022-01-13 08:33:13

    모르겠어요. libcurl에 대한 일반 파일로 작동하면 작동하지만 그렇게 하는지 의심스럽습니다. 제 추측으로는 작동하지 않을 것입니다...

    Daniel Stenberg2022-01-13 08:33:13

    @Alexander: 문자열 값이 있는 옵션(예: CURLOPT_URL, CURLOPT_SSLCERT 등)의 경우 php-curl은 단순히 전달된 값을 C-문자열로 변환하고 libcurl에 직접 전달합니다. libcurl은 php://memory에 대해 아무것도 모르기 때문에 불가능합니다.

    netcoder2022-01-13 08:33:13

    @netcoder 버그 보고서에서 이에 대한 해결 방법을 찾았습니다. bugs.php.net/bug.php?id=43468. CURLOPT_READFUNCTION을 사용하여 이러한 스트림에 대한 지원을 CURL에 추가할 수 있습니다. 그거 확인해야지...

    lisachenko2022-01-13 08:33:13

    @DanielStenberg 이 질문에 답한 지 몇 년이 지났습니다. 이에 대한 업데이트를 제공할 수 있습니까? 이제 libcurl에 인증서 및 키 파일을 문자열로 전달하는 API가 있습니까? 일부 상황에서는 궁극적으로 컬을 사용하기 전에 암호화되지 않은 파일에 키를 저장해야 합니다(좋지 않습니다!).

    Josh Bradley2022-01-13 08:33:13
  • 답변 # 2

    저는 SSL 전문가는 아니지만 CURLOPT_SSLKEY가 CURLOPT_SSLCERT public.pem 파일의 private.pem 파일인가요?

    내 매개변수

    CURLOPT_CAINFO=> /path/cacert.pem
    CURLOPT_SSLKEY=> /path/private.pem
    CURLOPT_SSLCERT=> /path/public.pem
    

    제가 제안한 답변을 시도해보고 도움이 되는지 여부를 알려주세요.

  • 답변 # 3

    사용tmp 파일()해결 방법으로 충분할 수 있습니다.

    $tempPemFile= tmpfile();
    fwrite($tempPemFile, $pemfile);
    $tempPemPath= stream_get_meta_data($tempPemFile);
    $tempPemPath= $tempPemPath['uri'];
    

    그런 다음:

    curl_setopt($ch, CURLOPT_SSLCERT, $tempPemPath);
    

    하지만 tmp 파일이 삭제되도록 종료했는지 확인하십시오.

    fclose($tempPemFile);
    

  • 답변 # 4

    임시 파일을 만들고 문자열을 파일에 쓴 다음 임시 파일을 가리킬 수 있습니다...

  • 이전 go : 런타임 유형에서 계산할 캐스팅 인터페이스{}
  • 다음 python : 파이썬에서 `a== b is not None`은 어떻게 해석됩니까? [복제하다]