Amiguinhos,
Consegui assinar com este código:
// #include "fivewin.ch"
// Code Sign
// https://github.com/JoseQuintas/sefazclass/blob/master/drafts/CodeSign.prg
#define URL "http://timestamp.verisign.com/scripts/timstamp.dll"
PROCEDURE Main
LOCAL oSignedCode, oSigner, oElement
LOCAL lInterage := .T.
Pega_Certificado(lInterage)
oSignedCode := win_OleCreateObject( "CAPICOM.SignedCode" )
oSigner := win_OleCreateObject( "CAPICOM.Signer" )
oSignedCode:FileName := "c:\sistema\executavel.exe"
oSignedCode:Description := "José C. Rocha"
oSignedCode:DescriptionURL := "www.5volution.com.br"
?"1", oSignedCode:Sign( oSigner, .t., 0 )
?"2", oSignedCode:TimeStamp( URL )
?"3", oSignedCode:Verify()
FOR EACH oElement IN oSignedCode:Certificates
? oElement:SubjectName
NEXT
RETURN
function win_OleCreateObject( _qual_ )
return TOleAuto():New( _qual_ )
********************************
Function Pega_Certificado(lInterage)
***************************************************************
* Retorna um Vetor com o numero de serie na primeira possição *
* e o vencimento do certificado na segunda possição *
* Leonardo Machado - 03/05/2010 *
***************************************************************
Local oCerts1, oCerts2, oCerts3, oStore, oCertificates, aVETOR:={}
default lInterage := .f.
oCertificates := win_OleCreateObject( "CAPICOM.Certificates" )
oStore := win_OleCreateObject( "CAPICOM.Store" )
// Encripta Uma string
cEncryptedData:= MemoRead( "Encrypted.txt" )
oEncryptedData:= TOleAuto():New( "CAPICOM.EncryptedData" )
oEncryptedData:Content := cEncryptedData
oEncryptedData:SetSecret(cEncryptedData,0)
? procline(), cEncryptedData, oEncryptedData:Encrypt
cString := oEncryptedData:Encrypt
// Desencripta Uma string
oEncryptedData:= TOleAuto():New( "CAPICOM.EncryptedData" )
oEncryptedData:SetSecret(cEncryptedData)
oEncryptedData:Decrypt(cString)
? procline(),oEncryptedData:Content
oStore:open(2,'My',2)
oCerts1:=oStore:Certificates()
oCerts2:=oCerts1:Select("Selecione o certificado para uso da Nfe","Selecione o certificado",lInterage)
IF oCerts2:Count() > 0
oCerts3 := oCerts2:Item(1)
AADD(aVETOR,{oCerts3:SerialNumber,oCerts3:ValidToDate})
ENDIF
Return(aVETOR)
Vale lembrar que criei este certificado em minha maquina seguindo algum tutorial da internet.
Algumas dicas importantes:
Fonte:http://www.sslshopper.com/article-most-common-openssl-commands.htmlComandos Gerais---------------------
1- Gerar uma chave privada e requisição de assinatura de certificado (CSR)
# openssl req -out CSR.csr -new -newkey rsa:2048 -nodes -keyout privateKey.key
2- Gerar um certificado auto-assinado
# openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout privateKey.key -out certificate.crt
3- Gerar uma requisição de assinatura de certificado (CSR) para uma chave privada existente
#openssl req -out CSR.csr -key privateKey.key -new
4- Gerar uma requisição de assinatura de certificado baseado em um certificado existente
# openssl x509 -x509toreq -in certificate.crt -out CSR.csr -signkey privateKey.key
5- Remover senha da chave privada
# openssl rsa -in privateKey.pem -out newPrivate.pem
Comandos para checagem usando openSSL----------------------------------------------------
1- Checar a requisição de assinatura de certificado.
#openssl req -text -noout -verify -in CSR.csr
2- Checar a chave privada.
#openssl rsa -in privateKey.key -check
3 - Checar o certificado.
#openssl x509 -in certificate.crt -text -noout
4- Checar arquivo pkcs#12 (.pfx ou .p12)
#openssl pkcs12 -info -in keyStore.p12
Debugar utilizando OpenSSL-----------------------------------
1- Verifique o hash MD5 da chave pública se é igual ao do CSR ou da chave privada
#openssl x509 -noout -modulus -in certificate.crt | openssl md5
#openssl rsa -noout -modulus -in privateKey.key | openssl md5
#openssl req -noout -modulus -in CSR.csr | openssl md5
2- Verifique a conexão SSL . Todos os certificados (incluindo os intermediários) devem ser exibidos
#openssl s_client -connect
www.paypal.com:443Conversões de formatos utilizando OpenSSL-----------------------------------------------------
1- Converter arquivo DER (.crt .cer .der) para PEM
#openssl x509 -inform der -in certificate.cer -out certificate.pem
2- Converter de PEM para DER
# openssl x509 -outform der -in certificate.pem -out certificate.der
3- Converter de arquivo PKCS#12 (.pfx .p12) contendo chave privada e certificados para PEM
#openssl pkcs12 -in keyStore.pfx -out keyStore.pem -nodes
You can add -nocerts to only output the private key or add -nokeys to only output the certificates.
4-Converter um certificado PEM com chave privada para PKCS#12 (.pfx .p12)
# openssl pkcs12 -export -out certificate.pfx -inkey privateKey.key -in certificate.crt -certfile CACert.crt
Para que não quebre a cabeça procurando onde postaram como criar, ai vai:
rem baixar openssl light e executar como administrador
c:\openssl\bin\openssl req -x509 -nodes -days 365 -newkey rsa:1024 -keyout mycert.pem -out mycert.pem
c:\openssl\bin\openssl pkcs12 -export -out mycert.pfx -in mycert.pem -name "onome"
Para entender o
makecert visite
https://docs.microsoft.com/pt-br/azure/vpn-gateway/vpn-gateway-certificates-point-to-site-makecertBaixe aqui uma versão mais atual caso ainda não a tenha na maquina. Geralmente fica na pasta
C:\Program Files\Microsoft SDKs\Windows\v7.1 para Windows Seven.
O
winhttpcertcfg.exe serve para instalar o certificado. Para entender como usá-lo visite
https://docs.microsoft.com/en-us/windows/desktop/winhttp/winhttpcertcfg-exe--a-certificate-configuration-toolCaso as ferramentas acima estejam instaladas em sua maquina, execute os passos a seguir:
@del hazael.pvk
@del hazael.cer
@del hazael.pfx
@del ServerCert.pvk
@del ServerCert.cer
@makecert -sky signature -r -pe -n "CN=hazael" -a sha1 -cy authority -sv hazael.pvk hazael.cer
@certutil -addstore Root hazael.cer
@makecert -pe -n "CN=ServerCert" -a sha1 -sky exchange -ic hazael.cer -iv hazael.pvk -sv ServerCert.pvk ServerCert.cer
@pvk2pfx -pvk ServerCert.pvk -spc ServerCert.cer -pfx hazael.pfx
@dir *.cer *.pvk *.pfx
Vai pedir senha em vários passos, coloque a mesma em todas as perguntas até que estejam gerados os arquivos.
No exemplo acima o .PFX ficou sem senha e na hora de instalar ao pedir senha deixe em branco e marque o campo ...Exportável.. e confirme.