PHP 에서 CURL 문자열 인증서 전송 을 지원 하 는 방법
최근 에 위 챗 결 제 를 할 때 환불 처 에서 인증 서 를 사용 해 야 합 니 다.저 희 는 SAAS 플랫폼 이기 때문에 여러 경로 로 결 제 를 지원 해 야 합 니 다.모든 인증서 파일 을 응용 서버 에 저장 하면 SLB 의 영향 을 받 아 특정한 기기 파일 이 동기 화 되 지 않 아 환불 절 차 를 방해 할 수 있 지만 파일 을 OSS 에 저장 하면백 엔 드 는 OSS 에서 응용 서버 로 다운로드 하여 일치 성 을 확보 해 야 한다.아무리 생각해 도 최종 적 으로 인증서 내용 을 데이터베이스 에 저장 하기 로 결 정 했 습 니 다.서로 다른 고객 은 각각 하나의 인증서 파일 에 대응 하기 로 결 정 했 습 니 다.몇 대의 기계 가 클 러 스 터 를 만 들 더 라 도 파일 의 일치 성 을 확보 할 수 있 고 불필요 한 다운로드 절 차 를 피 할 수 있 습 니 다.
문제.
그러나 문제 가 발생 했 습 니 다.PHP 의 CURL 인증 서 는 문자열 전송 을 지원 하지 않 고 인증서 경로 만 입력 할 수 있 습 니 다.
Client certificates must be specified by a path expression to a certificate store.
해결 과정
제 가 제일 먼저 생각 한 것 은 빈 파일 을 만 들 고 인증서 내용 을 쓰 는 것 입 니 다.인증서 사용 이 끝 난 후에 파일 을 삭제 하 는 것 입 니 다.그러나 실체 파일 을 만 들 고 삭제 하 는 작업 은 성능 을 소모 하 는 것 은 물론 이 고 매우 번 거 롭 습 니 다.임시 파일 을 만 드 는 방법 이 있 습 니까?있 습 니 다.tmpfile()함수 가 임시 파일 을 만 들 고 파일 경 로 를 가 져 다 줄 수 있 습 니 다.그래서 저 는 임시 파일 경 로 를 가 져 오 는 방법 을 썼 습 니 다.
<?php
public function getTmpPathByContent($content)
{
$tmpFile = tmpfile();
fwrite($tmpFile, $content);
$tempPemPath = stream_get_meta_data($tmpFile);
return $tempPemPath['uri']; ///tmp/phpXZCtAO
}
?>
비교적 슬 픈 것 은 이 방법 을 통 해 돌아 오 는 경 로 는 내용 을 전혀 읽 지 못 하고 심지어 한때 속 은 것 이 아니 라 고 생각 했다 는 것 이다.file_get_contents(/tmp/phpyyiOZv): failed to open stream: No such file or directory
공식 문 서 를 보고 나 서 야 이 유 를 찾 았 습 니 다.tmpfile()이 되 돌아 오 는 핸들 참조 계수 가 0 이면 임시 파일 을 회수 하고 임시 경로 도 자 연 스 럽 게 효력 을 잃 습 니 다.분명 한 방법 getTmpPathByContent()가 실 행 된 후에 국부 변수$tmpfile 의 생명주기 가 끝 납 니 다.(공식 문 서 는 다음 과 같 습 니 다)
The file is automatically removed when closed (for example, by calling fclose(), or when there are no remaining references to the file handle returned by tmpfile()), or when the script ends.
근원 을 확 인 했 습 니 다.프로 세 스 가 끝나 면 종료 되 는 변수 형식 을 찾 아서 핸들 을 저장 해 야 합 니 다.어떤 유형 이 조건 을 만족 시 킬 수 있 습 니까?정적 변수.정적 변 수 는 국부 변수 와 달리 PHP 라 이 프 사이클 이 시 작 될 때 메모리 공간 을 분배 하고 전역 변수 영역 에 저장 합 니 다.전역 변 수 는 모듈 닫 기 단계 에서 삭 제 됩 니 다.그러면 정적 변 수 를 설명 하면$tmpFile 참조 수 를 0 이상 유지 할 수 있 습 니 다.그러면 우리 코드 는 다음 과 같이 처리 할 수 있 습 니 다.
<?php
public function getTmpPathByContent($content)
{
static $tmpFile = null;
$tmpFile = tmpfile();
fwrite($tmpFile, $content);
$tempPemPath = stream_get_meta_data($tmpFile);
return $tempPemPath['uri'];
}
?>
다시 한 번 실행 하면 임시 파일 의 내용 을 성공 적 으로 읽 었 습 니 다.-----BEGIN CERTIFICATE-----
MIIEbDCCA9WgAwIBAgIEAWJKHDANBgkqhkiG9w0BAQUFADCBijELMAkGA1UEBhMC
Q04xEjAQBgNVBAgTCUd1YW5nZG9uZzERMA8GA1UEBxMIU2hlbnpoZW4xEDAOBgNV
BAoTB1RlbmNlbnQxDDAKBgNVBAsTA1dYRzETMBEGA1UEAxMKTW1wYXltY2hDQTEf
MB0GCSqGSIb3DQEJARYQbW1wYXltY2hAdGVuY2VudDAeFw0xNzA4MDcwOTIxNDda
Fw0yNzA4MDUwOTIxNDdaMIGbMQswCQYDVQQGEwJDTjESMBAGA1UECBMJR3Vhbmdk
b25nMREwDwYDVQQHEwhTaGVuemhlbjEQMA4GA1UEChMHVGVuY2VudDEOMAwGA1UE
CxMFTU1QYXkxMDAuBgNVBAMUJ+a3seWcs+W4guaYjua6kOi9r+S7tuiCoeS7veac
iemZkOWFrOWPuDERMA8GA1UEBBMIMTAyNTkyODEwggEiMA0GCSqGSIb3DQEBAQUA
A4IBDwAwggEKAoIBAQDg2D3++uOxY/yMGQPBnROvyYimnCsfGE0dnqdGUTCykqBh
yfv82zE1/St/4DQX2QDiIvLif+sMGcYwF4bkzdY+HgitYLI0k5o/5LCNZOMctuio
kdYC2bNdWHq2y9S5UWLQR1Zvq+6QyPBVBVY9yq9xtQhIlUTsZnICAp3iQLfQUR3l
aEdH9IERoRUIkbyb8oX5ONQz4P9jOeE9C5iwx0QrH4s01NFhkhr8JHlugRLpo9vA
xGgi/48fOlONj6wWal5Gt0OvvEbIwgQwya15KBX2YeGnZvYBQa+lQMeXEqZSFie3
G+wGvbtlONczQEtp+JDxLZLUS/FT7U0TQN/t8JDvAgMBAAGjggFGMIIBQjAJBgNV
HRMEAjAAMCwGCWCGSAGG+EIBDQQfFh0iQ0VTLUNBIEdlbmVyYXRlIENlcnRpZmlj
YXRlIjAdBgNVHQ4EFgQUjDJ75bu3Roog7XOH6uFAdZ6kpcIwgb8GA1UdIwSBtzCB
tIAUPgUm9iJitBVbiM1kfrDUYqflhnShgZCkgY0wgYoxCzAJBgNVBAYTAkNOMRIw
EAYDVQQIEwlHdWFuZ2RvbmcxETAPBgNVBAcTCFNoZW56aGVuMRAwDgYDVQQKEwdU
ZW5jZW50MQwwCgYDVQQLEwNXWEcxEzARBgNVBAMTCk1tcGF5bWNoQ0ExHzAdBgkq
hkiG9w0BCQEWEG1tcGF5bWNoQHRlbmNlbnSCCQC7VJcrvADoVzAOBgNVHQ8BAf8E
BAMCBsAwFgYDVR0lAQH/BAwwCgYIKwYBBQUHAwIwDQYJKoZIhvcNAQEFBQADgYEA
ucJLJkkHxlqQCEapZOWmySutqNVZxFbqyG//UXxxpA/1yG4e+KmufKZWv+c+MtYI
8i0KDDCv/UE+kkFIrHYDDKsdLRpxrYOUHGoqq0c7yBJ6Dimgy6m8U8FsEv3HtUR2
8g5xrg2Tc5MPWEp9ncEw575hGk0CXLDGOkI1nU+pGqk=
-----END CERTIFICATE-----
다음은 생 성 된 임시 파일 주 소 를 CURLOPT 로 설정 할 수 있 습 니 다.SSLCERT 입 니 다.
<?php
$sslCertPath = getTmpPathByContent($content);
curl_setopt($ch,CURLOPT_SSLCERT, $sslCertPath);
//......
?>
총결산이상 은 이 글 의 모든 내용 입 니 다.본 고의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가 치 를 가지 기 를 바 랍 니 다.여러분 의 저희 에 대한 지지 에 감 사 드 립 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Laravel - 변환된 유효성 검사 규칙으로 API 요청 제공동적 콘텐츠를 위해 API를 통해 Laravel CMS에 연결하는 모바일 앱(또는 웹사이트) 구축을 고려하십시오. 이제 앱은 CMS에서 번역된 콘텐츠를 받을 것으로 예상되는 다국어 앱이 될 수 있습니다. 일반적으로 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.