Documento HTML assinado
O arquivo HTML abaixo contém duas áreas de texto para o documento e a assinatura e uma rotina em javascript que monta o conteúdo a ser exibido: o documento assinado e os assinantes ao rodapé.
Se o cartão de identidade digital estiver inserido, a rotina exibe o conteúdo assinado ou co-assinado, caso o documento já contenha uma outra assinatura.
Também está embutido no código algum tratamento básico de erros.
Código Exemplo
<html>
..<head>
....<title>Documento</title>
..<OBJECT id="oCAPICOM" codeBase="http://download.microsoft.com/download/E/1/8/E18ED994-8005-4377-A7D7-0A8E13025B94/capicom.cab#version=2,0,0,3" classid="clsid:A996E48C-D3DC-4244-89F7-AFA33EC60679" VIEWASTEXT></OBJECT>
..<script language="JavaScript">
....// CAPICOM constants
....var CAPICOM_STORE_OPEN_READ_ONLY = 0;
....var CAPICOM_CURRENT_USER_STORE = 2;
....var CAPICOM_AUTHENTICATED_ATTRIBUTE_SIGNING_TIME = 0;
....var CAPICOM_ENCODE_BASE64 = 0;
....var CAPICOM_VERIFY_SIGNATURE_AND_CERTIFICATE = 1;
....function inicio()
....{
......if (txtAssinou.value=='S') return;
......else txtAssinou.value='S';
......try
......{
......var MyStore = new ActiveXObject("CAPICOM.Store");
......}
......catch(e)
......{
........publica("Sem suporte a ActiveX/CAPICOM: \n" + e.description);
........return;
........alert("alguma coisa terrível está acontecendo.");
......}
......//Suporte CAPICOM ok
......var SignedData = new ActiveXObject("CAPICOM.SignedData");
......var Signer = new ActiveXObject("CAPICOM.Signer");
......var TimeAttribute = new ActiveXObject("CAPICOM.Attribute");
......MyStore.Open(CAPICOM_CURRENT_USER_STORE, "My", CAPICOM_STORE_OPEN_READ_ONLY);
......SignedData.Content = txtDocumento.value;
......if (MyStore.Certificates.Count > 0)
......{
........if (MyStore.Certificates.Count==1) Signer.Certificate = MyStore.Certificates.Item(1)
........else
........try
........{
..........Signer.Certificate = MyStore.Certificates.Select().Item(1);
........}
........catch(e)
........{
..........publica(e.description);
..........return;
........}
........//Data
........var Today = new Date();
........TimeAttribute.Name = CAPICOM_AUTHENTICATED_ATTRIBUTE_SIGNING_TIME;
........TimeAttribute.Value = Today.getVarDate();
........Today = null;
........Signer.AuthenticatedAttributes.Add(TimeAttribute);
........//Assina ou Co-Assina
........if (txtAssinatura.value.length>0)
........{
..........try
..........{
............SignedData.Verify(txtAssinatura.value,true,CAPICOM_VERIFY_SIGNATURE_AND_CERTIFICATE);
..........}
..........catch(e)
..........{
............publica('Não foi possível validar a assinatura: \n' + e.description);
............return;
..........}
..........try
..........{
............txtAssinatura.value=SignedData.CoSign(Signer, CAPICOM_ENCODE_BASE64);
..........}
..........catch(e)
..........{
............publica('Não foi possível co-assinar o documento: \n' + e.description);
............return;
..........}
........}
........//Assina
........else
........{
..........try
..........{
............txtAssinatura.value=SignedData.Sign(Signer, true, CAPICOM_ENCODE_BASE64);
..........}
..........catch(e)
..........{
............publica('Não foi possível assinar o documento: \n' + e.description);
............return;
..........}
........}
........txtAssinou.value='S';
......}..
......//Validar Assinatura
......try
......{
........SignedData.Verify(txtAssinatura.value,true,CAPICOM_VERIFY_SIGNATURE_AND_CERTIFICATE);
......}
......catch(e)
......{
........publica('Não foi possível validar a assinatura: \n' + e.description);
........return;
......}
......//Extrair Signatários
......var i=0;
......var j=0;
......var v_msg="";
......for(i=1;i<=SignedData.Signers.Count;i++)
......{
........v_msg=v_msg+i+'. '+SignedData.Signers.Item(i).Certificate.SubjectName;
........for (j=1;j<=SignedData.Signers.Item(i).AuthenticatedAttributes.Count;j++)
..........v_msg=v_msg+' '+j+'. '+SignedData.Signers.Item(i).AuthenticatedAttributes.Item(j).Value;
........v_msg=v_msg+'\n<br>';
......}
......if (v_msg!="")
......{
........var Today = new Date();
........v_msg='<font size=-5>\n'+v_msg+'Assinatura certificada em '+Today.getVarDate()+'.\n</font>';
........Today = null;
......}
......//Mostra o Documento com os Signatários
......publica(v_msg);
....}
....function publica(p_msg)
....{
......var mywin = window.open('','_self','width=580,height=475,toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=yes,copyhistory=no,resizable=yes')
......mywin.document.writeln(txtDocumento.value);
......mywin.document.writeln('<hr>');
......mywin.document.writeln(p_msg);
....}
....</script>
..</head>
<body OnLoad="inicio()">
<p><b>TEXTO DO DOCUMENTO</b><p>
<!-- Início do Documento -->
<textarea disabled cols="80" rows="10" id="txtDocumento">
</textarea>
<!-- Fim do Documento -->
<html>
..<head>
....<title>Documento Teste – Marcos Katsumi Kay</title>
</head>
<body>
</body>
<p><center><b>
..COLOQUE AQUI O CONTEÚDO DO SEU DOCUMENTO HTML
</b></center></p>
<html>
<p><b>ASSINATURA DIGITAL</b><p>
<!-- Início da Assinatura -->
<textarea disabled cols="80" rows="10" id="txtAssinatura">
MIIgCwYJKoZIhvcNAQcCoIIf/DCCH/gCAQExCzAJBgUrDgMCGgUAMAsGCSqGSIb3
DQEHAaCCG1wwggQ4MIIDIKADAgECAgEVMA0GCSqGSIb3DQEBBQUAMIG0MQswCQYD
VQQGEwJCUjETMBEGA1UEChMKSUNQLUJyYXNpbDE9MDsGA1UECxM0SW5zdGl0dXRv
IE5hY2lvbmFsIGRlIFRlY25vbG9naWEgZGEgSW5mb3JtYWNhbyAtIElUSTERMA8G
..SUBSTITUA ISSO AQUI PELA ASSINATURA DO CONTEÚDO DO DOCUMENTO
NTE1MTUyMVowIwYJKoZIhvcNAQkEMRYEFEw5W9eBnVWYLEVqqG1izBwRc6jUMA0G
CSqGSIb3DQEBAQUABIGAjwsfd03Z76ygBlvEEYR2SdtSYGA6fQ8S8gFmkiYzy7o/
Ggss/pM8pskvc3Z5MLao5vx2ZG5YCiodeWIevxX3ljaV3fY0mPk+rFT4M6RRqjxF
IYZvTbN2WdKrTFlLU539C7AbqSYpfJ11qfIBGvPAJWZgNCwWcMpp3hjOJKXXJ28=
</textarea>
<!-- Fim da Assinatura -->
<p><input type="text" style="display:none" id="txtAssinou" size="1" value="N" hash=""/>
</body>
</html>