>  기사  >  백엔드 개발  >  PHP는 소켓을 사용하여 SSL 인증서와 웹사이트 샘플 코드의 공개 키를 얻습니다.

PHP는 소켓을 사용하여 SSL 인증서와 웹사이트 샘플 코드의 공개 키를 얻습니다.

怪我咯
怪我咯원래의
2017-07-13 09:18:221299검색

소켓(컴퓨터 용어)

네트워크의 두 프로그램은 양방향 통신 연결을 통해 데이터를 교환합니다. 이 연결의 한쪽 끝을 소켓이라고 합니다.

네트워크 통신 연결을 설정하려면 최소한 한 쌍의 포트 번호(소켓)가 필요합니다. 소켓의 핵심은 TCP/IP를 캡슐화하는 프로그래밍인터페이스(API)입니다. TCP/IP는 프로그래머가 네트워크 개발에 사용할 수 있는 인터페이스도 제공합니다. 이것이 바로 소켓 프로그래밍 인터페이스입니다. 또는 특정 형태의 데이터를 표시하는 소켓은 네트워크 통신 기능을 제공하는 엔진입니다.

소켓(Socket)의 원래 영어 의미는 "구멍" 또는 "소켓"입니다. BSD UNIX의 프로세스 통신 메커니즘으로는 후자의 의미를 갖는다. 일반적으로 "소켓"이라고도 하며 IP 주소와 포트를 설명하는 데 사용되며 통신 체인에 대한 핸들이며 서로 다른 가상 머신 또는 서로 다른 컴퓨터 간의 통신을 구현하는 데 사용할 수 있습니다. 인터넷상의 호스트는 일반적으로 여러 서비스 소프트웨어를 실행하고 동시에 여러 서비스를 제공합니다. 각 서비스는 소켓을 열고 포트에 바인딩됩니다. 다른 포트는 다른 서비스에 해당합니다. 소켓은 다중 구멍 소켓과 같이 영어의 원래 의미와 같습니다. 호스트는 다양한 소켓이 있는 방과 같습니다. 각 소켓에는 번호가 있습니다. 일부 소켓은 220V AC 전원을 제공하고 일부는 110V AC 전원을 제공하며 일부는 케이블 TV 프로그램을 제공합니다. 클라이언트 소프트웨어는 플러그를 다른 번호의 소켓에 연결하여 다른 서비스를 받습니다.

이 기사에서는 SSL 인증서와 웹사이트의 공개 키를 얻기 위해 소켓을 사용하는 PHP에 대한 관련 정보를 주로 소개합니다. 이 기사는 모든 사람을 위한 특정 참조 및 학습 가치를 제공합니다. 필요하신 분 아래에서 함께 살펴보시죠.

PHP 컬을 통해 웹페이지를 요청하면 인증서 정보를 얻을 수 없습니다. 이 경우 인증서 내용을 얻으려면 SSL 소켓을 사용해야 합니다. 자세한 소개를 살펴보겠습니다:

샘플 코드:

// 创建 stream context
$context = stream_context_create([
 'ssl' => [
  'capture_peer_cert' => true,
  'capture_peer_cert_chain' => true,
 ],
]);
 
$resource = stream_socket_client("ssl://$domain:$port", $errno, $errstr, 30, STREAM_CLIENT_CONNECT, $context);
$cert = stream_context_get_params($resource);
 
$ssl = $cert['options']['ssl'];
$resource = $ssl['peer_certificate'];
 
// 网站证书中只有公钥,通过 openssl_pkey_get_details 导出公钥
 
$ret = [
 'crt' => '',
 'pub' => '',
];
 
$pkey = openssl_pkey_get_public($resource);
$ret['pub'] = openssl_pkey_get_details($pkey)['key'];
 
openssl_x509_export($resource, $pem);
$ret['crt'] = $pem;
 
foreach ($ssl['peer_certificate_chain'] as $resource)
{
 openssl_x509_export($resource, $pem);
 $ret['crt'] .= "\n" . $pem;
}
 
// 保存 $ret['crt'] 为 domain.crt
// 保存 $ret['pub'] 为 domain.pub
 
return $ret;

인증서의 공개 키 A가 올바른지 확인하고, 개인 키를 통해 공개 키 B를 내보낸 후 둘을 비교하여 일치하는지 확인합니다. 일관된.

$domain = 'blog.zhengxianjun.com';
$port = '443';
// ...
$pub_a = $ret['pub'];
 
$private_key_path = '/conf/ssl/blog.zhengxianjun.com.key';
 
// 证书没有设置密码,$passphrase 为空字符串
$pkey = openssl_pkey_get_private(file_get_content($private_key_path), $passphrase = '');
$pub_b = openssl_pkey_get_details($pkey)['key'];
 
// 两者一致
var_dump($pub_a === $pub_b);

Function stream_socket_client의 또 다른 용도는 서버 IP가 알려졌을 때 서버가 사용할 수 있는 도메인 이름을 가져오는 것입니다.

$resource = stream_socket_client("ssl://$ip:$port", $errno, $errstr, 30, STREAM_CLIENT_CONNECT, $context);
$cert = stream_context_get_params($resource);
 
// 解析 X.509 格式证书
$info = openssl_x509_parse($cert['options']['ssl']['peer_certificate']);
 
// 获取证书中的可信域名列表
$domain = str_replace('DNS:', '', $info['extensions']['subjectAltName']);

위에서 볼 수 있듯이 웹사이트 인증서를 획득해도 개인키를 획득할 수는 없습니다.

CDN을 사용하는 일부 사이트에서 HTTPS를 사용하고 자신의 도메인 이름을 사용하려는 경우 CDN 공급업체에 개인 키를 제공해야 하나요? 실제로 인증서 경로와 사용자 이름(https를 지원하는 도메인 이름)이 일치할 필요는 없습니다.

즉, 자체 도메인 이름을 사용하고 CDN 가속을 수행하는 경우 자체 SSL 인증서를 사용할 필요가 없으며 제조업체 인증서의 도메인 이름 목록에 자체 CDN 도메인 이름을 추가하기만 하면 됩니다.

위 내용은 PHP는 소켓을 사용하여 SSL 인증서와 웹사이트 샘플 코드의 공개 키를 얻습니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.