2014-11-21 26 views
5

Tôi đang cố gắng để thiết lập một khách hàng Xà phòng với đoạn mã sau:khách hàng SOAP PHP với giấy chứng nhận qua SSL

<?php 
$wsdl   = 'https://domain.com/?wsdl'; 
$endpoint  = 'https://domain.com'; 
$certificate = dirname(__FILE__) . '/CertWithKey.pem'; 
$password  = 'pwd'; 

$options = array(
    'location'  => $endpoint, 
    'keep_alive' => true, 
    'trace'   => true, 
    'local_cert' => $certificate, 
    'passphrase' => $password, 
    'cache_wsdl' => WSDL_CACHE_NONE 
); 

try { 
    $soapClient = new SoapClient($wsdl, $options); 
} catch(Exception $e) { 
    var_dump($e); 
} 

tôi đã được đưa ra một đuôi .p12 khóa tập tin với một tệp giấy chứng nhận .crt. Sử dụng openssl Tôi đã chuyển đổi tệp .p12 thành tệp .pem và sau đó hợp nhất tệp đó với tệp .crt. CertWithKey.pem có vẻ tốt với tôi, hai khối chứng chỉ có trong tệp.

Bất kể tôi cố gắng làm gì, tôi vẫn nhận được ngoại lệ với thông báo SOAP-ERROR: Parsing WSDL: Couldn't load from 'https://domain.com/?wsdl' : failed to load external entity "https://domain.com/?wsdl".

Sau khi gọi điện với bên từ xa, họ thừa nhận rằng yêu cầu sẽ đến nhưng họ đang ghi nhật ký lỗi này: ssl handshake interrupted by system [hint: stop button pressed in browser?!].

Vì tôi không tìm thấy bất kỳ thông tin hữu ích nào trên mạng nên tôi đã tìm hiểu các bạn về một số thông tin chi tiết về vấn đề này.

Bất kỳ đề xuất nào có thể được thử? Tôi đang chạy PHP 5.3.8 và địa chỉ IP của máy chủ là màu trắng được liệt kê trong tường lửa tại bên từ xa.

Trả lời

4

Tôi đã khắc phục sự cố này. Tôi nghĩ, do số lượng câu hỏi liên quan đến vấn đề này và số lượng giải pháp khác nhau, số khác sẽ được hưởng lợi từ giải pháp. Ở đây đi:

Tôi đã sử dụng chương trình CLI openssl để chuyển đổi khóa .p12 thành tệp khóa .pem. Bí quyết là cách chuyển đổi diễn ra.

Trước tiên tôi chuyển đổi nó với lệnh này và tôi đã có vấn đề như mô tả trong câu hỏi:

openssl pkcs12 -in key.p12 -out key.pem -nodes -clcerts

Trong khi lệnh dưới đây đã làm các trick thực tế:

openssl pkcs12 -in key.p12 -out key.pem -clcerts

Đối thêm thông tin, vui lòng xem nguồn tôi đã sử dụng: https://community.qualys.com/docs/DOC-3273

+0

Tôi cũng đang cố gắng gửi yêu cầu SOAP đến một máy chủ. Tôi đang đối mặt với một vấn đề tương tự mà tôi không thể giao tiếp với máy chủ thông qua ứng dụng php của mình. nhưng hoạt động thông qua GUI SOAP. Tôi có tệp .p12 mà tôi đã cố gắng sử dụng bằng cách chuyển đổi thành tệp .pem. Khi tôi tạo đối tượng khách hàng SOAP, tôi nhận được lỗi: SOAP-ERROR: Phân tích cú pháp WSDL: Không thể tải từ https: // ? Wsdl: không tải được thực thể bên ngoài https: // ? Wsdl Có thể bạn hãy cho tôi biết những gì đang xảy ra ở đây? –

+0

Nếu bạn đã làm theo câu trả lời của tôi và các tập tin quan trọng và crt được hợp nhất thành công, máy chủ từ xa có thể đã kích hoạt tường lửa và chặn địa chỉ IP của bạn. Nếu không tôi không thể nói được, có lẽ bạn nên mở một câu hỏi sau đó. – Ben

+0

Tôi gặp vấn đề tương tự. Và tôi đã làm theo các bước chính xác mà @Ben đã cung cấp. Các p12 đã được chuyển đổi thành .pem bằng cách sử dụng liên kết được cung cấp.Nhưng tôi vẫn nhận được lỗi: curl: (58) Không thể tải khách hàng cert -8018 Kỳ lạ thay, tôi đã nhận ra rằng cụm từ mật khẩu mà tôi đang cung cấp là 3 -digits '123', thay vào đó tôi phải cung cấp một số cụm từ mật khẩu hợp lệ gồm 6 ký tự chữ cái. Vì vậy, tôi tin rằng, phải có một số cụm từ mật khẩu dài (Không biết chiều dài tối thiểu). Điều tiếp theo bị thiếu là các tùy chọn 'local_cert', 'mật khẩu' cần được cung cấp trong khởi tạo đối tượng SoapClient. –

-1

gợi ý tương tự:

  1. tôi sử dụng SoapClient để kết nối với các dịch vụ SSL, và tất cả hoạt động tốt mà không cần chỉ định "endpoint" URL. Sau đó, tôi khuyên bạn nên thử mà không có tùy chọn này;

  2. php SoapClient có tùy chọn có tên "ssl_method" nơi bạn có thể thay đổi một số biến thể của giao thức này. Hãy thử thay đổi/chỉ định tham số này nếu bạn biết giao thức nào được sử dụng;

  3. Chỉ định "verifypeer => false" và "verifyhost => false" trên danh sách thông số;

+0

Cảm ơn câu trả lời của bạn. '1:' Tôi cũng đã thử nó mà không có điểm cuối; không may mắn. '2:' Do phiên bản PHP của tôi, tôi không thể sử dụng ssl_method. '3:' Tôi có sai hoặc là người xác minh và xác minh các tham số không có giấy tờ (hoặc ít nhất là chúng không có trong tài liệu: http://php.net/manual/en/soapclient.soapclient.php). Không có sự khác biệt trong việc cung cấp cho họ. – Ben

+0

'Chỉ định" verifypeer => false "và" verifyhost => false "trên danh sách params;' Điều này có nghĩa là vô hiệu hóa bảo mật. luôn luôn là một ý tưởng tồi –

Các vấn đề liên quan