Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Fábio BN

Validar um certificado SSL no ASP com XML ?

Recommended Posts

Oi Pessoal, como eu faço para validar um certificado digital pelo ASP usando o XML?
Abaixo segue o exemplo em PHP, alguém tem isto em ASP?

//  CURLOPT_SSL_VERIFYPEER
    //  verifica a validade do certificado
    curl_setopt($sessao_curl, CURLOPT_SSL_VERIFYPEER, true);
    //  CURLOPPT_SSL_VERIFYHOST
    //  verifica se a identidade do servidor bate com aquela informada no certificado
    curl_setopt($sessao_curl, CURLOPT_SSL_VERIFYHOST, 2);

    //  CURLOPT_SSL_CAINFO
    //  informa a localização do certificado para verificação com o peer
    curl_setopt($sessao_curl, CURLOPT_CAINFO, getcwd() .
            "/ssl/VeriSignClass3PublicPrimaryCertificationAuthority-G5.crt");
    curl_setopt($sessao_curl, CURLOPT_SSLVERSION, 3);

    //  CURLOPT_CONNECTTIMEOUT
    //  o tempo em segundos de espera para obter uma conexão
    curl_setopt($sessao_curl, CURLOPT_CONNECTTIMEOUT, 10);

    //  CURLOPT_TIMEOUT
    //  o tempo máximo em segundos de espera para a execução da requisição (curl_exec)
    curl_setopt($sessao_curl, CURLOPT_TIMEOUT, 40);

    //  CURLOPT_RETURNTRANSFER
    //  TRUE para curl_exec retornar uma string de resultado em caso de sucesso, ao
    //  invés de imprimir o resultado na tela. Retorna FALSE se há problemas na requisição
    curl_setopt($sessao_curl, CURLOPT_RETURNTRANSFER, true);

    curl_setopt($sessao_curl, CURLOPT_POST, true);
    curl_setopt($sessao_curl, CURLOPT_POSTFIELDS, $paPost );

    $resultado = curl_exec($sessao_curl);
    
    curl_close($sessao_curl);

    if ($resultado)
    {
        return $resultado;
    }
    else
    {
        return curl_error($sessao_curl);
    }
}

// Monta URL de retorno
function ReturnURL()
{
    $pageURL = 'http';

    if ($_SERVER["SERVER_PORT"] == 443) // protocolo https
    {
        $pageURL .= 's';
    }
    $pageURL .= "://";
    if ($_SERVER["SERVER_PORT"] != "80")
    {
        $pageURL .= $_SERVER["SERVER_NAME"].":".$_SERVER["SERVER_PORT"].$_SERVER["REQUEST_URI"];
    } else {
        $pageURL .= $_SERVER["SERVER_NAME"]. substr($_SERVER["REQUEST_URI"], 0);
    }
    // ALTERNATIVA PARA SERVER_NAME -> HOST_HTTP

    $file = substr($_SERVER["SCRIPT_NAME"],strrpos($_SERVER["SCRIPT_NAME"],"/")+1);

    $ReturnURL = str_replace($file, "retorno.php", $pageURL);

    return $ReturnURL;
}

Obrigado!
Fábio.

Compartilhar este post


Link para o post
Compartilhar em outros sites

vc pode usar o componente X509Certificate2

Compartilhar este post


Link para o post
Compartilhar em outros sites

Oi xanburzum.

 

Eu trabalho com a CIELO desde 2005 e no dia de hoje eles atualizaram o Certificado de Validade Extendida deles, e pediram para os donos das lojas virtuais atualizarem o certificado no servidor onde está hospedado o site. Eles forneceram um arquivo de certificado para download e pediram para os lojistas fazer o DownLoad e instalar no servidor da loja virtual.

Na verdade, eu sempre fiz a comunicação entre site e CIELO sem precisar validar o certificado conforme o código em PHP acima. Ainda não sei se será necessário a validação do certificado. Eu enviei hoje para o pessoal do meu servidor o arquivo do Certificado Extended Validation para eles instalarem no servidor e ainda não me deram retorno da instalação, pode ser que após a instalação o erro que está dando desapareça.
O erro aparece na linha do SEND na hora de enviar o XLM para a CIELO.

msxml6.dll erro '800c0008'
Falha no download do recurso especificado

Agora eu te pergunto, existe certificados que funcionam sem a necessidade de usar o HTTPS? Digo isso pois eu sempre me comuniquei com a CIELO via XML sem usar HTTPS e sempre funcionou.

Outra coisa, a CIELO pode fornecer o mesmo certificado para várias lojas usarem, sem a necessidade de ter um específico para cada loja?

Obrigado pela ajuda!
Fábio.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Oi.

 

Achei um cara com o mesmo problema, mas tem haver com o certificado.
https://community.developer.authorize.net/t5/Integration-and-Testing/Classic-ASP-sample-code-for-AIM-Error/td-p/7204

Não sei se o problema é no meu código, ou e tenho que usar outro componente.

Quando eu troco de objeto, para

 Set objSrvHTTP = Server.CreateObject("MSXML2.ServerXMLHTTP.6.0")

O erro é outro:

msxml6.dll erro '80072f7d'

An error occurred in the secure channel support

Abraços!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vejam a Reposta da CIELO:

Eles primeiramente anexam um certificado no e-mail e pedem para instalarmos no servidor.

 

Segue a reposta da CIELO.
Boa tarde, será necessário proceder com as atualizações abaixo:

1. Atualização do Certificado Digital de Validade Estendida:
Para melhorar a segurança da plataforma Cielo E-commerce, foi feito a atualização do Certificado SSL atual para o Certificado Digital de Validação Estendida no dia 02/02/2015.
O objetivo da atualização é aumentar a proteção do site, tornando-o mais confiável para os clientes que acessam e realizam compras virtualmente.
A loja virtual deve descompactar o arquivo em anexo e instalar na Trustedstore do servidor, especialmente em ambientes Java e PHP.

O Certificado Digital deve ser instalado pelo Administrador do seu servidor ou pelo provedor de hospedagem do site.

Caso sua equipe seja responsável por essa atualização e possua dúvidas quanto ao procedimento a ser seguido, segue algumas dicas:

http://www.speedhelp.com.br/index.php?/Knowledgebase/List/Index/16/informaes-sobre-a-instalao-e-utilizao-dos-certificados

2. Bloqueio SSLv3:
Para se manter em conformidade com o PCI-DSS, no dia 02/02/2015 a Cielo deixará de aceitar transações que usarem o protocolo SSLv3. Esse procedimento será adotado para evitar riscos de vulnerabilidades.
Caso a aplicação utilize somente o protocolo SSLv3 como forma de criptografia de dados, é necessário que sua aplicação seja atualizada para utilizar o TLS.



Dicas: Caso a loja esteja utilizando a linguagem PHP e o procedimento mencionado não funcione, altere dentro do include.php a versão do Certificado de 3 para 4.

DE: curl_setopt($sessao_curl, CURLOPT_SSLVERSION, 3);
PARA: curl_setopt($sessao_curl, CURLOPT_SSLVERSION, 4);

Caso a alteração não funcione, altere para:

CURL_SSLVERSION_TLSv1

Veja mais orientações no site: Curl

http://www.speedhelp.com.br/index.php?/Knowledgebase/List/Index/16/informaes-sobre-a-instalao-e-utilizao-dos-certificados

Existem sistemas que não suportam o protocolo criptográfico TLS, neste caso, será necessário a atualização da versão.
Exemplo: Versão do Open 1.0 não suporta, sendo necessário a atualização para versão mais recente.

P.S.: Esta orientação possui a finalidade de sugerir uma alternativa de uso para uma função PHP. Sua aplicação assim como possíveis adaptações que possa ocorrer em função dela, são de responsabilidade do desenvolvedor. A Cielo não oferece suporte a programação.

Cordialmente,

************************

Bom, essa foi a resposta da CIELO.

- Eu antes de mais anda preciso ter a certeza que o pessoal do meu servidor instalou o certificado corretamente, pedi os Prints da tela mas até agora não me enviaram.

- Outra coisa, eu sempre me comuniquei com a CIELO usando XML simples e funcionou, só agora que tá acontecendo o erro. Complicado de resolver.

Abraços!

Compartilhar este post


Link para o post
Compartilhar em outros sites

geralmente vários hosts já tem suporte a esse certificado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Oi Xanburzum.

 

O pessoal do meu servidor ficaram de instalar o certificado lá, ainda não me deram retorno, pois no meu servidor existem vários sites e talvez quando instalam para um, vai para todos.

 

Eu encontrei na rede um código novo de verificar certificado em PHP.

 

Não sei se tem como traduzir isso para ASP.

<?php
if ($this->config->get('cielo_teste') == 1) {
    define('ENDERECO',"https://qasecommerce.cielo.com.br/servicos/ecommwsec.do");
} else {
    define('ENDERECO',"https://ecommerce.cbmp.com.br/servicos/ecommwsec.do");
}
define('VERSAO', "1.2.1");
define('CIELO', $this->config->get('cielo_afiliacao'));
define('CIELO_CHAVE', $this->config->get('cielo_chave'));

if (hash('sha512', $_SERVER['SERVER_NAME']) != $this->config->get('cielo_licenca')){
$this->redirect('index.php?route=payment/cielo/licenciamento');
}


if ($this->config->get('ssl') == 1){
       define('RETORNO_URL',HTTPS_SERVER . "index.php?route=payment/cielo/retorno");
} else {
       define('RETORNO_URL',HTTP_SERVER . "index.php?route=payment/cielo/retorno");
}

if(!isset($_SESSION["pedidos"]))
{
    $_SESSION["pedidos"] = new ArrayObject();
}

// Envia requisição
function httprequest($paEndereco, $paPost){

    $sessao_curl = curl_init();
    curl_setopt($sessao_curl, CURLOPT_URL, $paEndereco);
    curl_setopt($sessao_curl, CURLOPT_FAILONERROR, true);
    curl_setopt($sessao_curl, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($sessao_curl, CURLOPT_SSL_VERIFYHOST, 2);
    curl_setopt($sessao_curl, CURLOPT_CAINFO, DIR_APPLICATION . "controller/payment/cielo_lib/ssl/VeriSignClass3PublicPrimaryCertificationAuthority-G5.crt");
    curl_setopt($sessao_curl, CURLOPT_SSLVERSION, 1);
    curl_setopt($sessao_curl, CURLOPT_CONNECTTIMEOUT, 10);
    curl_setopt($sessao_curl, CURLOPT_TIMEOUT, 40);
    curl_setopt($sessao_curl, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($sessao_curl, CURLOPT_POST, true);
    curl_setopt($sessao_curl, CURLOPT_POSTFIELDS, $paPost );

    $resultado = curl_exec($sessao_curl);

    curl_close($sessao_curl);

    if ($resultado)
    {
        return $resultado;
    }
    else
    {
        return curl_error($sessao_curl);
    }
}

// Monta URL de retorno
function ReturnURL(){
    $ReturnURL = RETORNO_URL;
    return $ReturnURL;
}

?

Já para ASP, a única coisa que achei foi um código genérico:

Function SendRequest(Xml, Url, id, key)

    Dim XmlHttp, BasicAuthentication, ResponseXml

      Set XmlHttp = Server.CreateObject("Msxml2.ServerXMLHTTP.3.0")
      XmlHttp.Open "POST", Url, false

        Const SXH_OPTION_IGNORE_SERVER_SSL_CERT_ERROR_FLAGS = 2
        Const SXH_SERVER_CERT_IGNORE_ALL_SERVER_ERRORS = 13056

        XmlHttp.SetOption SXH_OPTION_IGNORE_SERVER_SSL_CERT_ERROR_FLAGS, _
            (XmlHttp.getOption(SXH_OPTION_IGNORE_SERVER_SSL_CERT_ERROR_FLAGS) - _
            SXH_SERVER_CERT_IGNORE_ALL_SERVER_ERRORS)

        BasicAuthentication = Base64Encode(id & ":" & Key)
        XmlHttp.SetRequestHeader "Authorization", "Basic " & BasicAuthentication
        XmlHttp.SetRequestHeader "Content-Type", "application/xml; charset=UTF-8"
        XmlHttp.SetRequestHeader "Accept", "application/xml; charset=UTF-8"
        XmlHttp.Send Xml

        ResponseXml = XmlHttp.ResponseText
        SendRequest = ResponseXml
        Set XmlHttp = Nothing

  End Function

E achei mais informações neste link:
https://msdn.microsoft.com/en-us/library/ms753798%28v=vs.85%29.aspx

Bem. Se eu conseguir algo aviso. Senão terei que tentar outra alternativa!
Se alguém puder ajudar:
E-mail: fabiobal@uol.com.br ou poste aqui mesmo.

Abraços!

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

O cliente informa os dados do cartão no seu sistema ou no ambiente da Cielo?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Oi.

 

Eu uso o método ( Buy Page Cielo ) que toda a informação deve ser digitada no ambiente da CIELO.

Uma coisa que eu fiz foi alterar o objeto do XML de

'Set objSrvHTTP = Server.CreateObject("MSXML2.XMLHTTP.6.0")
Onde dava o erro:
msxml6.dll erro '800c0008'
Falha no download do recurso especificado 

Para

Set objSrvHTTP = Server.CreateObject("Msxml2.ServerXMLHTTP.6.0")
Onde agora dá o erro:
msxml6.dll erro '80072f7d'
An error occurred in the secure channel support

Segundo a CIELO, nenhuma alteração precisa ser feita no código da página, apenas no servidor. A CIELO enviou 3 arquivos de certificados, que creio eu devem ser instalados em cadeia, e a má instalação deles podem ocasionar ao não funcionamento da comunicação entre os servidores.
Lá onde eu hospedo o site usa Windows 2003 Server - IIS versão 6.0.

O pessoal disse que instalaram os certificados, mas mesmo asism o erro pesiste, talvez a instalação não foi feita corretamente. Eu preciso que eles verifiquem isso né?

Abraços!

Compartilhar este post


Link para o post
Compartilhar em outros sites

isso acontece algumas vezes com certificado SSL inválido. maioria das vezes, você só precisa reinstalar o certificado SSL. dependendo da versão do Windows Server o IIS, não pode validar um certificado X.509 em algumas aplicações que usam a API de criptografia (CAPI). Esse problema ocorre se o certificado é garantido pela Secure Hash Algorithm 2 (SHA2) família de algoritmos de hash. Os aplicativos podem não funcionar como esperado se eles exigem a família SHA2 de algoritmos de hash.

 

podendo ser resolvido aqui - http://support.microsoft.com/kb/938397

Compartilhar este post


Link para o post
Compartilhar em outros sites

Oi Xanburzum

O LINK da CIELO que usa o novo certificado é este:
https://ecommerce.cielo.com.br/servicos/ecommwsec.do
Ao acessar vai aparecer isto: HTTP method GET is not supported by this URL
Mas se clicar no Certificado, vai aparecer o tipo de certificado.

Veja que a informação do certificado aparece em verde, e aparece o nome da empresa bem visível.

O Link antigo é este:
Existe outro LINK que usa o Certificado antigo, que seria este:
https://ecommerce.cbmp.com.br/servicos/ecommwsec.do
Esse aqui funciona ainda, a comunicação é feita, o novo é que não funciona mais.

Bom, você avaliando os 2 certificados, consegue ver se eles trabalham com algoritmos diferentes?
Eu olhei e parece que o tipo de criptografia utilizado são os mesmos, dá uma olhada se você puder me falar.

 

Abraços!

Fábio.



Compartilhar este post


Link para o post
Compartilhar em outros sites

Oi.

 

Fiz uma comparação entre 2 certificados:

Link 1 ( Funciona ) : Usa certificado antigo
https://ecommerce.cbmp.com.br/servicos/ecommwsec.do

 

Link 2 ( Não Funciona ): Usa Certificado Novo

https://ecommerce.cielo.com.br/servicos/ecommwsec.do

Erro:
msxml6.dll erro '80072f7d'

An error occurred in the secure channel support

 

 

Abraços!

Fábio!

Compartilhar este post


Link para o post
Compartilhar em outros sites

no IIS esta correto para validar o certificado X.509 e sua criptografia

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu vou fazer um teste em PHP aqui para ver se no PHP funciona essa conexão com a CIELO.
Depois mando os resultados!

 

Abraços!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu vou fazer um teste em PHP aqui para ver se no PHP funciona essa conexão com a CIELO.

Depois mando os resultados!

 

Abraços!

boa fabio tenta em php

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom.

 

Hoje, segunda-feira a CIELO alterou a validade do certificado, e agora começou a dar novamente o erro ao LINK antigo cujo eu estava utilizando.

 

Não estou mais conseguindo conectar via XML pelo link (https://ecommerce.cbmp.com.br/servicos/ecommwsec.do )

Está dando erro:
msxml6.dll erro '80072f7d'
An error occurred in the secure channel support

 

Se alguém tiver uma solução avise!

 

Obrigado!

Fábio!

Compartilhar este post


Link para o post
Compartilhar em outros sites

em vários casos o update resolveu, tenta e depois posta aqui

Compartilhar este post


Link para o post
Compartilhar em outros sites

Oi Xanburzum.

 

Tenho uma notícia boa, eu tenho um domínio do meu site .COM que estava sem hospedagem, hoje resolvi hospedar o mesmo na Godaddy, e o meu código ASP funcionou de primeira, sem fazer nenhuma alteração ele abrou o site da CIELO de primeira! Lá usam WindowsServer 2012 na hospedagem.

 

Agora tenho certeza que o meu problema é no Windows Server 2003, me deram até 48 horas para instalarem o HOTFIX, depois te retorno se deu certo ou não.

 

Obrigado!

 

Fàbio!!
Abraços!

Fábio!

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.