1

我有几个使用 DBI 的 Perl 脚本,我正在清理它们并将其转换为 Rose::DB。我的公司使用名为 Password Manager Pro (PMP) 的产品来管理身份验证资源。PMP 有一个XML-RPC API,我正在尝试构建一个模块,Rose::DB::Object 将调用该模块来获取数据库资源的密码,而不是将凭据存储为明文。

我查看了RPC::XMLXML::RPC并且找不到 ssl 的选项。我在 Google 上搜索了一个基于 HTTPS 的 XML-RPC 示例,但没有运气。

我的大部分脚本都与数据库相关,到目前为止我还没有对基于 Web 的模块做太多事情。我希望有人可以推荐一个解决方案/示例,说明如何将以下 XML 传递到服务器并使用 SSL 证书标识自己:

<?xml version="1.0" encoding="utf-8"?>
<methodCall>
  <methodName>pmp.password.retrieve</methodName>
    <params>
      <param>
        <value><string>pmp-server</string></value>
      </param>
      <param>
        <value><string>administrator</string></value>
      </param>
    </params>
</methodCall> 

我使用以下内容开始了我的模块,但是如果没有将 ssl 呈现给服务器,它就不好了:

#!/usr/bin/perl

use XML::RPC;
my $certfile = /home/api/.ssl/pmp.p12;  #Where to pass this?
my $xmlrpc = XML::RPC->new('https://pmp.local:7070/xmlrpc');
my @result = $xmlrpc->call( 'pmp.password.retrieve', {
   resourceName => 'DBSERV', 
   userAccount => 'APITest', 
   reason => 'Test' 
});

print @result;

任何建议帮助将不胜感激。

4

2 回答 2

0

XML::RPC 首先使用 LWP(如果他安装了),用于 SSL 的 LWP 使用 Crypt::SSLeay 和 Net::SSL,它们使用以下变量:

$ENV{HTTPS_PKCS12_FILE}     = 'certs/pkcs12.pkcs12';
$ENV{HTTPS_PKCS12_PASSWORD} = 'PKCS12_PASSWORD';

UPD:所有密钥(如果需要)。

# proxy support
$ENV{HTTPS_PROXY} = 'http://proxy_hostname_or_ip:port';

# proxy_basic_auth
$ENV{HTTPS_PROXY_USERNAME} = 'username';
$ENV{HTTPS_PROXY_PASSWORD} = 'password';

# debugging (SSL diagnostics)
$ENV{HTTPS_DEBUG} = 1;

# default ssl version
$ENV{HTTPS_VERSION} = '3';

# client certificate support
$ENV{HTTPS_CERT_FILE} = 'certs/notacacert.pem';
$ENV{HTTPS_KEY_FILE}  = 'certs/notacakeynopass.pem';

# CA cert peer verification
$ENV{HTTPS_CA_FILE}   = 'certs/ca-bundle.crt';
$ENV{HTTPS_CA_DIR}    = 'certs/';

# Client PKCS12 cert support
$ENV{HTTPS_PKCS12_FILE}     = 'certs/pkcs12.pkcs12';
$ENV{HTTPS_PKCS12_PASSWORD} = 'PKCS12_PASSWORD';
于 2012-04-25T01:49:02.777 回答
0

一种解决方案(虽然可能不是最好的)是使用像stunnel这样的 SSL 代理。您将其设置为侦听端口,然后使用适当的证书将进入的任何连接转发到另一个地址/端口。这是一个更动人的部分,虽然不太理想,但它确实完成了工作。

于 2012-04-25T00:37:09.660 回答