Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将TLS/SSL安全POST请求从node.js发送到IIS_Node.js_Ssl_Iis_Https_Request - Fatal编程技术网

将TLS/SSL安全POST请求从node.js发送到IIS

将TLS/SSL安全POST请求从node.js发送到IIS,node.js,ssl,iis,https,request,Node.js,Ssl,Iis,Https,Request,我有一个node.js webapp运行在我的Windows Server 2012上的IIS 8.5(使用发布)上,我已经将其配置为使用我刚购买的证书。因此,我将证书添加到服务器: 并将我的网站配置为使用https和我刚才配置的证书: 现在我可以像这样访问我的网站了 好的,我的node.js客户端在网络之外的一些计算机上运行,并不时向服务器发送一些数据。现在我有了SSL证书,我想保护这个连接 我的目标是从客户端发布HTTPS,只有使用有效证书的客户端才允许将数据上传到我的url 所以首先,

我有一个node.js webapp运行在我的Windows Server 2012上的IIS 8.5(使用发布)上,我已经将其配置为使用我刚购买的证书。因此,我将证书添加到服务器:

并将我的网站配置为使用https和我刚才配置的证书:

现在我可以像这样访问我的网站了

好的,我的node.js客户端在网络之外的一些计算机上运行,并不时向服务器发送一些数据。现在我有了SSL证书,我想保护这个连接

我的目标是从客户端发布HTTPS,只有使用有效证书的客户端才允许将数据上传到我的url

所以首先,我强迫国际空间站在我的网站上申请证书。在SSL配置中,我选中了“必需”选项:

下一步要做的是使用https和我的证书从my node.js上传数据。问题是my node.js https POST请求得到了IIS的权限拒绝网站作为响应

我的node.js请求代码是:

var config = require('./config');
var request     = require('request');
var path = require('path');
var fs = require('fs');  

var certFile = path.resolve(__dirname, 'tls/certificate.crt');
var keyFile = path.resolve(__dirname, 'tls/certificate.key');
var caFile = path.resolve(__dirname, 'tls/certificate.ca.crt');
var pfxFile = path.resolve(__dirname, 'tls/certificate.pfx');



var credentials ={
    "email":config.EMAIL,
    "password":config.PASSWORD
}

request.post({
    uri: config.LOGIN_URL, //https://example.com/upload
    headers: { 
        'content-type': 'application/x-www-form-urlencoded',
        'User-Agent' : 'Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko'
    },
    body: require('querystring').stringify(credentials),
    rejectUnauthorized: false,
    agentOptions: {
        cert: fs.readFileSync(certFile),
        key: fs.readFileSync(keyFile),
        // Or use `pfx` property replacing `cert` and `key` when using private key, certificate and CA certs in PFX or PKCS12 format:
        // pfx: fs.readFileSync(pfxFilePath),
        ca: fs.readFileSync(caFile),
        securityOptions: 'SSL_OP_NO_SSLv3'
    }
}, function(err, res, body){
        if (!err && res.statusCode === 200) {
            console.log('OK!');
        } else  { 
            console.log("Error: ",err);    
        }
});
我的体系结构中缺少什么,使得IIS允许我的HTTPS POST请求验证我从客户端发送的证书

编辑:我现在正在node.js客户端中使用我在服务器(IIS)中添加的同一个pfx文件进行测试。我现在的代理提示是:

 agentOptions: {
            pfx: fs.readFileSync(pfxFile),
            passphrase: 'MyPfxPassPhrase',
            securityOptions: 'SSL_OP_NO_SSLv3'
        }
同样的结果:(

EDIT2:我使用免费的cloudflare服务作为DNS和一点额外的安全性(DDos保护等)。我不知道这是否会导致问题

EDIT3:我在互联网上读到,可能我必须与windows用户创建一对一映射,所以我按照指南进行配置。相同的结果:403-权限被拒绝

编辑4:我激活了SSL错误跟踪,现在我可以看到确切的错误代码是:
HTTP 403.16禁止:客户端证书不受信任或无效。
确切地说,日志是:

<failedRequest url="https://example.com:443/"
               siteId="6"
               appPoolId="example"
               processId="3544"
               verb="GET"
               authenticationType="NOT_AVAILABLE"               activityId="{00000000-0000-0000-0D00-0080000000F7}"
               failureReason="STATUS_CODE"
               statusCode="403.16"
               triggerStatusCode="403.16"
               timeTaken="0"
               xmlns:freb="http://schemas.microsoft.com/win/2006/06/iis/freb"
               >
</failedRequest>

我不知道是否需要将COMODO RSA CA添加到受信任的根证书颁发机构证书存储、中间证书颁发机构(CA)或外部根证书颁发机构。。。 我的证书具有以下认证路径:

EDIT5:我使用wireshark捕捉TLS谈判。这是结果,我无法得出任何结论:


您好!您能显示服务器的代码吗?另外,您发布的错误日志似乎是针对GET请求的。打开Wireshark,尝试查看TLS协商的进展情况。@MariaInesParnisari您是对的。该错误是GET请求,因为我正在使用带有cert配置的浏览器在浏览器上测试该问题我得到了同样的错误(权限被拒绝)当我应该看到网站时,因为我得到了证书的认可。我认为这是一个测试它的好方法。@marainesparnisari关于服务器的代码,它只是一个在node.js中提供服务的网站。拒绝权限错误是由IIS发送的,IIS是网站提供服务之前的一个软件层,所以我猜这不是网站的错,而是ISS的错