Ir para conteúdo

Arquivado

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

Juan Roas

Certificado Digital - Janela Pin do tipo A3 não aparece no Servidor

Recommended Posts

Gente tenho uma aplicação Web Forms feita com Activix e itextsharp.dll, que assina um documento PDF, quando rodo a aplicação na minha maquina funciona, porem quando publico ela no servidor Windows funciona somente ate o momento que a aplicação solicita o certificado do navegador do cliente mas quando vai exibir a caixa para digitar a senha(pin) do token(A3 - USB) não mostra. Na classe AClass.cs tem o método do Itextsharp.dll que chama o Pin - MakeSignature.SignDetached();
​alguém pode me ajudar? segue o que consegui ate agora.

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="WebTest45.Default" %>
<!DOCTYPE html>
<!DOCTYPE html>
<head runat="server">
<title></title>
<script language="javascript">
function assinar() {
if (confirm("Deseja confirmar essa operação?")) {
var x = new ActiveXObject("ANamespace.AClass");
x.Assinador(document.getElementById("hdfPath").value);
return true;
} else {
return false;
}
}
</script>
</head>
<body>
<form id="form1" runat="server">
<asp:HiddenField runat="server" ID="hdfPath" />
Criar Documento:
<div>
<asp:TextBox runat="server" ID="txtCriar" Style="width: 155px; padding-top: 2px"></asp:TextBox>
</div>
<div style="padding-left: 5px; top: 20px;">
<asp:LinkButton runat="server" ID="LinkButton2" type="button" OnClick="CriarDocumento" class="btn btn-primary">Criar Documento</asp:LinkButton>
</div>
<div style="padding-left: 5px; top: 20px;">
<asp:LinkButton runat="server" ID="LinkButton1" type="button" OnClientClick="javascript:return assinar();" class="btn btn-primary">Assinar</asp:LinkButton>
</div>
<div style="padding-left: 5px; top: 20px;">
<asp:LinkButton runat="server" ID="LinkButton3" type="button" OnClick="Download" class="btn btn-primary">Download</asp:LinkButton>
</div>
</form>
</body>

</html>

using iTextSharp.text;
using iTextSharp.text.pdf;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.IO;
using System.Linq;
using System.Net;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace WebTest45
{
public partial class Default : System.Web.UI.Page
{
string path
{
get { return ViewState["PATH"] == null ? string.Empty : (string)ViewState["PATH"]; }
set { ViewState["PATH"] = value; }
}
string Arquivo
{
get { return ViewState["ARQUIVO"] == null ? string.Empty : (string)ViewState["ARQUIVO"]; }
set { ViewState["ARQUIVO"] = value; }
}
protected void Page_Load(object sender, EventArgs e)
{
string msgErro = string.Empty;
try
{
if (!IsPostBack)
{
Session["PATH"] = "~//anexos//";
}
}
catch (Exception ex)
{
msgErro = ex.Message;
throw new Exception("Error-" + ex.Message);
}
}
public void CriarDocumento(object sender, EventArgs e)
{
if (!string.IsNullOrEmpty(txtCriar.Text))
{
path = Session["PATH"].ToString();
path = Server.MapPath(path);
if (!Directory.Exists(path))
{
Directory.CreateDirectory(path);
}
Arquivo = txtCriar.Text;
hdfPath.Value = path + Arquivo;
FileStream fs = new FileStream(path + Arquivo + ".pdf", FileMode.Create, FileAccess.Write, FileShare.None);
Document doc = new Document();
PdfWriter writer = PdfWriter.GetInstance(doc, fs);
doc.Open();
doc.Add(new Paragraph("TESTANDO ASSINATURA NOVA PARA O ARQUIVO:" + Arquivo));
doc.Close();
}
}
public void Download(object sender, EventArgs e)
{
if (!string.IsNullOrEmpty(Arquivo))
{
FileStream sourceFile = new FileStream(Server.MapPath("~//anexos//" + Arquivo + "Assinado.pdf"), FileMode.Open);
float FileSize;
FileSize = sourceFile.Length;
byte[] fileContent = new byte[(int)FileSize];
sourceFile.Read(fileContent, 0, (int)sourceFile.Length);
sourceFile.Close();
Response.ClearContent();
Response.ClearHeaders();
Response.Buffer = true;
Response.ContentType = "application/octet-stream";
Response.AddHeader("Content-Length", fileContent.Length.ToString());
Response.AddHeader("Content-Disposition", "attachment; filename=Teste.pdf");
Response.BinaryWrite(fileContent);
Response.Flush();
Response.End();
}
}
}

}

using System;
using System.Runtime.InteropServices;
using System.Security.Cryptography.X509Certificates;
using Org.BouncyCastle.X509;
using Org.BouncyCastle.Security;
using iTextSharp.text.pdf;
using System.IO;
using iTextSharp.text.pdf.security;
using System.Collections.Generic;
using System.Collections;
namespace ANamespace
{
[ClassInterface(ClassInterfaceType.AutoDual)]
public class AClass
{
public void Assinador(string path_NomeArquivo)
{
X509CertificateParser cp = new X509CertificateParser();
//BUSCA OS CERTIFICADOS DO USUARIO
X509Certificate2 certClient = null;
X509Store st = new X509Store(StoreName.My, StoreLocation.CurrentUser);
st.Open(OpenFlags.MaxAllowed);
X509Certificate2Collection collection = X509Certificate2UI.SelectFromCollection(st.Certificates, "Por Favor, Escolha um certificado:", "", X509SelectionFlag.SingleSelection);
if (collection.Count > 0)
{
certClient = collection[0];
}
st.Close();
//Get Cert Chain
IList<Org.BouncyCastle.X509.X509Certificate> chain = new List<Org.BouncyCastle.X509.X509Certificate>();
X509Chain x509chain = new X509Chain();
x509chain.Build(certClient);
foreach (X509ChainElement x509ChainElement in x509chain.ChainElements)
{
chain.Add(DotNetUtilities.FromX509Certificate(x509ChainElement.Certificate));
}
//ARQUIVO PARA ASSINAR
PdfReader reader = new PdfReader(path_NomeArquivo + ".pdf");
//NOVO DOCUMENTO
FileStream resStream = new FileStream(path_NomeArquivo + "Assinado.pdf", FileMode.Create, FileAccess.ReadWrite);
PdfStamper stamper = PdfStamper.CreateSignature(reader, resStream, '\0', null, true);
PdfSignatureAppearance appearance = stamper.SignatureAppearance;
appearance.ReasonCaption = "Descrição:";
appearance.Reason = "Assinar Documento Teste";
appearance.LocationCaption = "Local:";
appearance.Location = "Defensoria Publica";
//Local onde fica o Field da assinatura digital
if (stamper.Reader.Info["CreationDate"].ToString() == stamper.Reader.Info["ModDate"].ToString())
{
appearance.SetVisibleSignature(new iTextSharp.text.Rectangle(20, 10, 170, 60), 1, "Signed");
}
X509Certificate2Signature es = new X509Certificate2Signature(certClient, "SHA-1");
//SOLICITA SENHA
MakeSignature.SignDetached(appearance, es, chain, null, null, null, 0, CryptoStandard.CMS);
}
}
}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

caso alguém queira testar é preciso gerar um dll da classe AClass.cs e referencia o itextsharp.dll faço via linha de comando, é preciso colocar o "itextsharp.dll" e a classe "AClass.cs" na pasta que esta o executável "CSC", segue o código.

\Windows\Microsoft.NET\Framework\v4.0.xxxxx
csc /t:library AClass.cs /r:itextsharp.dll
regasm AClass.dll /tlb /codebase

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por Loconarrativo
      Eu recebi aqui alguns arquivos .cer e preciso instalar no servidor que tenho, ele esta com CentOS. Os que tenho aqui são: 
      Autoridade_Certificadora_ RaizBrasileira_v5.cer SERASA_Autoridade_Certificadora_Principal_v5.cer SERASA_CD_SSL_V5.cer cobranca.bb.com.br.cer Qualquer informação é bem vinda, sou totalmente leigo nessa area!
       
    • Por peterhall
      Preciso consumir um web service soap (wsdl) com certificado digital mas não estou a conseguir.
      Testei através do SoapUI e resultou sem erros, mas na hora de aplicar num script de php, não estou a conseguir que funcione.
      O que fiz até ao momento: converti o certificado digital de .pfx para .pem com chave privada incluída e procurei executar o script com os parâmetros de conexão e xsd de saída.
      Na documentação consta este xsd de saída:
       
      A resposta, se com erro, deverá ser:
       
      Resposta sem erro:
       
      O meu script:
      <?php date_default_timezone_set("America/Fortaleza"); $time = new DateTime; $data = $time->format(DateTime::ATOM); $wsdl = 'https://selodigital.tjce.jus.br/wsselodigital-homologacao/SolicitacaoSelo?wsdl'; $endpoint = 'https://selodigital.tjce.jus.br/wsselodigital-homologacao/SolicitacaoSelo'; $certificate = "certificado.pem"; $password = 'senha'; $options = array( 'location' => $endpoint, 'keep_alive' => true, 'trace' => true, 'local_cert' => $certificate, 'passphrase' => $password, 'cache_wsdl' => WSDL_CACHE_NONE, array('versao' => '1.12', 'dataHora' => $data, 'ambiente' => '2', 'codigoServentia' => '000123', 'nomePessoa' => 'Nome de Teste', 'tipoDocumento' => '1', 'idSolicitacaoSelo' => '1', 'sequencial' => '1', 'codigo' => '6', 'quantidade' => '10' ) ); try { $soapClient = new SoapClient($wsdl, $options); } catch(Exception $e) { var_dump($e); }  
      O erro que tenho recebido:
       
      Onde estarei errando?
    • Por kcirtapsi
      Boa tarde,
       
      É possível assinar um documento digitalmente com o PHP?
       
      Sendo que o processo seria, o arquivo estando no servidor, por meio de uma página PHP, o usuário assina o documento,
      utilizando seu certificado.
×

Informação importante

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