signature_dfe 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitignore +2 -0
- data/.travis.yml +1 -1
- data/CHANGELOG +2 -0
- data/Gemfile.lock +43 -0
- data/README.md +79 -10
- data/certs/certificate.p12 +0 -0
- data/certs/certificate.pem +23 -0
- data/certs/gen.sh +4 -0
- data/certs/key.pem +30 -0
- data/lib/signature_dfe/nfe.rb +67 -0
- data/lib/signature_dfe/ssl.rb +81 -0
- data/lib/signature_dfe/version.rb +1 -1
- data/lib/signature_dfe.rb +15 -2
- data/signature_dfe.gemspec +3 -2
- metadata +38 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ebe21fdf284216178ca792906a643e8246cd96a9b4cf948729343b7e015a4a82
|
4
|
+
data.tar.gz: 87db1c580cee2c5bd9ac8800a12780e033da743e6ee22ec2f874932b7225a1eb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ea69d110856af0bcb6afa790a475edd8f37aeefb711c536393fc561075aa5cf7c6b449829697c8d3b1f6b5ef69494609c1b2608c950927b61215eb0364f2dd04
|
7
|
+
data.tar.gz: 13a849a8fb96bc6ff76400ec698d3000838e911f28f8c47ed9c18d659a8b0351a7a1b4dafefc6b51660903fe364efb2a0e071d2d3992ab6257df2b92ef534c46
|
data/.gitignore
CHANGED
data/.travis.yml
CHANGED
data/CHANGELOG
CHANGED
data/Gemfile.lock
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
signature_dfe (0.1.0)
|
5
|
+
|
6
|
+
GEM
|
7
|
+
remote: https://rubygems.org/
|
8
|
+
specs:
|
9
|
+
diff-lcs (1.3)
|
10
|
+
ipaddr (1.2.2)
|
11
|
+
mini_portile2 (2.4.0)
|
12
|
+
nokogiri (1.9.1)
|
13
|
+
mini_portile2 (~> 2.4.0)
|
14
|
+
openssl (2.1.2)
|
15
|
+
ipaddr
|
16
|
+
rake (10.5.0)
|
17
|
+
rspec (3.8.0)
|
18
|
+
rspec-core (~> 3.8.0)
|
19
|
+
rspec-expectations (~> 3.8.0)
|
20
|
+
rspec-mocks (~> 3.8.0)
|
21
|
+
rspec-core (3.8.0)
|
22
|
+
rspec-support (~> 3.8.0)
|
23
|
+
rspec-expectations (3.8.2)
|
24
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
25
|
+
rspec-support (~> 3.8.0)
|
26
|
+
rspec-mocks (3.8.0)
|
27
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
28
|
+
rspec-support (~> 3.8.0)
|
29
|
+
rspec-support (3.8.0)
|
30
|
+
|
31
|
+
PLATFORMS
|
32
|
+
ruby
|
33
|
+
|
34
|
+
DEPENDENCIES
|
35
|
+
bundler (~> 1.17)
|
36
|
+
nokogiri (~> 1.9.1)
|
37
|
+
openssl (~> 2.1.2)
|
38
|
+
rake (~> 10.0)
|
39
|
+
rspec (~> 3.0)
|
40
|
+
signature_dfe!
|
41
|
+
|
42
|
+
BUNDLED WITH
|
43
|
+
1.17.2
|
data/README.md
CHANGED
@@ -1,10 +1,13 @@
|
|
1
1
|
# SignatureDfe
|
2
2
|
|
3
|
-
|
3
|
+
Assinatura digital de documentos fiscais eletrônicos (DF-e)
|
4
4
|
|
5
|
-
TODO: Delete this and the text above, and describe your gem
|
6
5
|
|
7
|
-
##
|
6
|
+
## Descrição
|
7
|
+
|
8
|
+
Assine seu DF-e de forma rápida e fácil
|
9
|
+
|
10
|
+
## Instalação
|
8
11
|
|
9
12
|
Add this line to your application's Gemfile:
|
10
13
|
|
@@ -20,19 +23,85 @@ Or install it yourself as:
|
|
20
23
|
|
21
24
|
$ gem install signature_dfe
|
22
25
|
|
23
|
-
##
|
26
|
+
## Usando
|
27
|
+
|
28
|
+
Você vai precisar do certificado PKCS12 ou da chave privada e o certificado público.
|
29
|
+
|
30
|
+
No caso de você ter o arquivo PKCS12
|
31
|
+
|
32
|
+
```ruby
|
33
|
+
SignatureDfe::SSL.config.pkcs12 = "caminho/para/seu/cert.p12"
|
34
|
+
SignatureDfe::SSL.config.password = "sua_senha"
|
35
|
+
```
|
36
|
+
|
37
|
+
Já se vc usa a chave privada e o certificado separado
|
38
|
+
|
39
|
+
```ruby
|
40
|
+
SignatureDfe::SSL.config.pkey = "caminho/para/sua/chave_privada.pem"
|
41
|
+
SignatureDfe::SSL.config.password = "sua_senha"
|
42
|
+
SignatureDfe::SSL.config.cert. = "caminho/para/seu/certificado_publico.pem"
|
43
|
+
```
|
44
|
+
|
45
|
+
Feito esta configuração você testa, no cado se tudo certo, o resultado será true
|
46
|
+
|
47
|
+
```ruby
|
48
|
+
SignatureDfe::SSL.test
|
49
|
+
```
|
24
50
|
|
25
|
-
|
51
|
+
Feito esta configuração vc já está pronto para assinar seus documentos.
|
26
52
|
|
27
|
-
##
|
53
|
+
## Assinatura digital NF-e NFC-e e NFA-e
|
28
54
|
|
29
|
-
|
55
|
+
Observe que os 3 documentos possuem a mesma estrutura
|
56
|
+
Para assinar sua nf-e existem duas formas
|
30
57
|
|
31
|
-
|
58
|
+
A forma qual vc tem a xml da assinautra completo onde vc passa o seu xml contendo a tag <b>infNFe</b>
|
32
59
|
|
33
|
-
|
60
|
+
```ruby
|
61
|
+
inf_nfe = %{
|
62
|
+
<infNFe Id="NFe00000000000000000000000000000000000000000000" versao="3.10">
|
63
|
+
...
|
64
|
+
</infNFe>}
|
65
|
+
SignatureDfe::NFe.sign inf_nfe
|
66
|
+
```
|
34
67
|
|
35
|
-
|
68
|
+
Onde a resposta será
|
69
|
+
|
70
|
+
```xml
|
71
|
+
<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
|
72
|
+
<SignedInfo>
|
73
|
+
<CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
|
74
|
+
<SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
|
75
|
+
<Reference URI="#NFe#{ch_nfe}">
|
76
|
+
<Transforms>
|
77
|
+
<Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
|
78
|
+
<Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
|
79
|
+
</Transforms>
|
80
|
+
<DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
|
81
|
+
<DigestValue>...</DigestValue>
|
82
|
+
</Reference>
|
83
|
+
</SignedInfo>
|
84
|
+
<SignatureValue>...</SignatureValue>
|
85
|
+
<KeyInfo>
|
86
|
+
<X509Data>
|
87
|
+
<X509Certificate>...</X509Certificate>
|
88
|
+
</X509Data>
|
89
|
+
</KeyInfo>
|
90
|
+
</Signature>
|
91
|
+
```
|
92
|
+
|
93
|
+
Ou você pode obter os valores do <b>DigestValue</b>, <b>SignatureValue</b> e <b>X509Certificate</b> manualmente, e assim montar da forma como desejar seu xml
|
94
|
+
|
95
|
+
```ruby
|
96
|
+
inf_nfe = %{
|
97
|
+
<infNFe Id="NFe00000000000000000000000000000000000000000000" versao="3.10">
|
98
|
+
...
|
99
|
+
</infNFe>}
|
100
|
+
ch_nfe = "0000000000000000000000000000000000000000000"
|
101
|
+
digest_value = SignatureDfe::NFe.digest_value inf_nfe
|
102
|
+
signature_value = SignatureDfe::NFe.signature_value ch_nfe, digest_value
|
103
|
+
x509certificate = SignatureDfe::SSL.cert
|
104
|
+
```
|
36
105
|
|
37
106
|
## License
|
38
107
|
|
Binary file
|
@@ -0,0 +1,23 @@
|
|
1
|
+
-----BEGIN CERTIFICATE-----
|
2
|
+
MIIDxjCCAq4CCQC4OYuPO6x6fTANBgkqhkiG9w0BAQsFADCBpDELMAkGA1UEBhMC
|
3
|
+
VVMxETAPBgNVBAgMCE5ldyBZb3JrMREwDwYDVQQHDAhOZXcgWW9yazELMAkGA1UE
|
4
|
+
CgwCSVQxFTATBgNVBAsMDEhvc3RpbmcgVGVhbTEXMBUGA1UEAwwOd3d3LmRvbWFp
|
5
|
+
bi5jb20xHTAbBgkqhkiG9w0BCQEWDnlvdXJAZW1haWwuY29tMRMwEQYDVR0RDApk
|
6
|
+
b21haW4uY29tMB4XDTE5MDEwNjA4MTgwMFoXDTIwMDEwNjA4MTgwMFowgaQxCzAJ
|
7
|
+
BgNVBAYTAlVTMREwDwYDVQQIDAhOZXcgWW9yazERMA8GA1UEBwwITmV3IFlvcmsx
|
8
|
+
CzAJBgNVBAoMAklUMRUwEwYDVQQLDAxIb3N0aW5nIFRlYW0xFzAVBgNVBAMMDnd3
|
9
|
+
dy5kb21haW4uY29tMR0wGwYJKoZIhvcNAQkBFg55b3VyQGVtYWlsLmNvbTETMBEG
|
10
|
+
A1UdEQwKZG9tYWluLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
|
11
|
+
AKnnw4vXl4FcQWXjPLVi5xwwcdYoQdA+0vvtepf2XXdlbsQocaAG7VvdQgPeLafm
|
12
|
+
epnKaYHZ+6xP9q5NiGLUgUzeB9+TZSl7zocMm3flMQomHzk3eU3jCbenGB9NXXCS
|
13
|
+
5UeL20FVVdg8kVvFZWx6a7ABhJU5GeSnZo1hl5MPy02+ljP50nn2ZeMbSNQPjWrT
|
14
|
+
pwaHIOtlqhEMSW5wcGVOXQAf0eojzm9ZufdBGAm4TmfE9Mr09TjQLzJrGe3HPDoE
|
15
|
+
z39KPlW6QJxhHdKAnDFww3/SqieL9vInJ7Y0SCeuz4DT4TuMqQgT1beCmdvEETqE
|
16
|
+
ePLd6IZY0iE2kjRk3zNdCXUCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAg9GB9kgt
|
17
|
+
bfuJtrpHgt2qYJWt/UesAco0827bmzEV3FrIkoRwIABHGizIV7J9rP3dKoSJX5xK
|
18
|
+
pefOdnYXCx7Nt7MSLdYTCt6zmKcFGx/ibwUdDxdNYmCsS0brYXMOVcvSKJDVF8PG
|
19
|
+
Go1ebtYZU9JHJqfhGnrs6YgRSuybC4xQUYbN91pVc7Ts29yOKpUxrMPoIf3wbmWo
|
20
|
+
+s9qP+1lAK3eszg5OEoYKqSikp4ycsv3WiBAG5+emsHJaXG5TnwgvRjbp8iAyAzb
|
21
|
+
a2AaAMbtFd3GNT+/bsgMjhGTGI8RVV4QBTNeWlkVdV0VSGsjk7DGcBx5Vs8+LVBk
|
22
|
+
S8JTXOld2Ha+5w==
|
23
|
+
-----END CERTIFICATE-----
|
data/certs/gen.sh
ADDED
@@ -0,0 +1,4 @@
|
|
1
|
+
openssl req -newkey rsa:2048 -keyout key.pem -x509 -days 365 -out certificate.pem -subj '/C=US/ST=New York/L=New York/O=IT/OU=Hosting Team/CN=www.domain.com/emailAddress=your@email.com/subjectAltName=domain.com'
|
2
|
+
openssl x509 -text -noout -in certificate.pem
|
3
|
+
openssl pkcs12 -inkey key.pem -in certificate.pem -export -out certificate.p12
|
4
|
+
openssl pkcs12 -in certificate.p12 -noout -info
|
data/certs/key.pem
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
-----BEGIN ENCRYPTED PRIVATE KEY-----
|
2
|
+
MIIFDzBJBgkqhkiG9w0BBQ0wPDAbBgkqhkiG9w0BBQwwDgQIfdH+OnVlAl0CAggA
|
3
|
+
MB0GCWCGSAFlAwQBKgQQNVqjaefmKGLOl69iTgEOvwSCBMAUd8z+tT9fAiPkCdy1
|
4
|
+
T2fJikEADxVgy20tLRJsCR0gQtgL/eGqFY6TSxPBfXFVB1J8W4QyWis9BylxqR/7
|
5
|
+
qrcr639kytlu8948TsSuoj6I1kdw82cc4rSj8VWeoZvuuOMBQHFNXh4DzLPxtFwO
|
6
|
+
2bijtakoCV+ptlP70VydAgNxHaybUXi4zzeKt+TZtPzJaNHNEJRXLGOc9kwqCV+h
|
7
|
+
kLmiLSwegW8P0bmEpUV2M28XUDH15uBIsPRv/hOpte2c1saHUw4y2oEdn1A5GAqg
|
8
|
+
wuiqZxOeNIJr6CcOPjNxvRF+dhwr5czSShalloI8pfq/NhlqHChkZEcyuQW/8mUA
|
9
|
+
Y/w3mOi8pNnbQ8YCn3HE2xF70TB0SH07IMJoqMzfftCUa+rsKFl7o9wuY6Z+TqC6
|
10
|
+
MYzQ3ggBTe6bJsXuV+2Qn+rJDdakzZw6gr2KdLFE8jVyMFnYBmSMPHDpw693Z58z
|
11
|
+
m6RRfjKsVGhzs9ATjCRk7VhsGIBk+KyS3L6fukCdfIfBVioxPy56xbHmFIBVwSuf
|
12
|
+
HC2es4kaaOUlxmPLgYfz2IgHyqQjkvfcVCg5OYAeO3q+AGP6fVUjDABX+Hh44V1d
|
13
|
+
CvfZYYPG4p9UeeBCyWfaL6W57SPHIdt9Rw9jRb6nBWmAq4cpgExmhpjTgq76PESp
|
14
|
+
Ah0K2R0Fah7i2/nCJ8gYV8cw1Noo1Lwjw9AguZpc1i+J4FQW9U1zzq359vonQamW
|
15
|
+
dL3zesE0ku8tdY7FiZIUHxZ3h/i1USZ09IVr75iMGGtIY5mAQIxE+xOTUKFJg7VE
|
16
|
+
Ga3gM6DAxD6sZVx6ZaMeGdHP9Eia6cIdZWWJ+EFlJHI7Cn4FMFooQW0Cd49W7yWE
|
17
|
+
MCa2unfXi6zpp/2BL59+Ws35GbircEG+4+wsOMzYt9udyFKvv6+WkIGGEOfA0Vd9
|
18
|
+
rC3BnzQWh6bNNiMo8+aLnQlP0OH5POX+rYBODPDL9ZuQweguzQCRhWNr3s+pXxbZ
|
19
|
+
KgMXJak1Lvq3vvF2/NxgpekspR//I9h0LgRABas3qHoe1YT4piKkRdLVXDbOwAmK
|
20
|
+
O9D6hzJhTmd3tIqBfR+OTtTbP9in1nUbjGwCLICkWsrngCP1sC4zhUetwskA5KNA
|
21
|
+
CRAElbbPJhelh4vJvhlk/CeNwNV+j77xwrs215N0Kwk677dJlqo5iXvPXSG2myjN
|
22
|
+
Ke9UzPv7+ndfEsf2WDzES/H0rCPvs3VUWBy9IdeiiDW/r6I0Ndubxp4D1clEmE5/
|
23
|
+
Vxx4HtIwg0EBAQgfUWb71XjzmgZC5LoIerARP3+feYO39bqU5DlWgVrMLIZmumSq
|
24
|
+
uWc5poe8Q/bSHvsCHxqz/ccCDeKoyS/uML3HCmfeSkNqneZtgXW0E5Kk07ZsQQz4
|
25
|
+
JB80vvXcGQLRX5sm69C9Os8zfE2QDzn9i76/+2TfRWN9W6lBzSrhaJAu+51t7yDM
|
26
|
+
aInAjxqVazDU0LMKXve2DOzVAe1JtxKZ3WtIzv1iDsIJwf+k+Ct1iv/1LNmNUY4q
|
27
|
+
P3bw31mra5/v0iC95d+fuR9t05fRApksehxFqKVUA10rdiTZYadk+g/Uy8G6vcs0
|
28
|
+
MeiTiS/TLFltbjx6vBNuSNv1dGmEQFjX/a/hBmctEMn9cljciF+Qn1sEt3+SBdE/
|
29
|
+
cwSZ
|
30
|
+
-----END ENCRYPTED PRIVATE KEY-----
|
@@ -0,0 +1,67 @@
|
|
1
|
+
require 'base64'
|
2
|
+
require 'nokogiri'
|
3
|
+
module SignatureDfe
|
4
|
+
class NFe
|
5
|
+
def self.sign something
|
6
|
+
if something.is_a? String
|
7
|
+
digest_value_ = digest_value something
|
8
|
+
|
9
|
+
ch_nfe = something.scan(/\<infnfe[\s\S]*?\>/i)[0].scan(/\d{44}/)[0]
|
10
|
+
|
11
|
+
signature_value_ = signature_value ch_nfe, digest_value_
|
12
|
+
|
13
|
+
%{<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
|
14
|
+
<SignedInfo>
|
15
|
+
<CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
|
16
|
+
<SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
|
17
|
+
<Reference URI="#NFe#{ch_nfe}">
|
18
|
+
<Transforms>
|
19
|
+
<Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
|
20
|
+
<Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
|
21
|
+
</Transforms>
|
22
|
+
<DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
|
23
|
+
<DigestValue>#{digest_value_}</DigestValue>
|
24
|
+
</Reference>
|
25
|
+
</SignedInfo>
|
26
|
+
<SignatureValue>#{signature_value_}</SignatureValue>
|
27
|
+
<KeyInfo>
|
28
|
+
<X509Data>
|
29
|
+
<X509Certificate>#{SignatureDfe::SSL.cert.to_s.gsub(/\-\-\-\-\-[A-Z]+ CERTIFICATE\-\-\-\-\-/, "").strip}</X509Certificate>
|
30
|
+
</X509Data>
|
31
|
+
</KeyInfo>
|
32
|
+
</Signature>}.gsub(/\>\s{1,}\</,"><").strip
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def self.canonize_inf_nfe inf_nfe
|
37
|
+
tag_inf_nfe = inf_nfe.scan(/\<infnfe[\s\S]*?\>/i)[0]
|
38
|
+
SignatureDfe.canonize(tag_inf_nfe.include?(%{xmlns="http://www.portalfiscal.inf.br/nfe"}) ? tag_inf_nfe : inf_nfe.gsub(%{<infNFe},%{<infNFe xmlns="http://www.portalfiscal.inf.br/nfe"}))
|
39
|
+
end
|
40
|
+
|
41
|
+
def self.signature_value ch_nfe, digest_value
|
42
|
+
signed_info = %{
|
43
|
+
<SignedInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
|
44
|
+
<CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
|
45
|
+
<SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
|
46
|
+
<Reference URI="#NFe#{ch_nfe}">
|
47
|
+
<Transforms>
|
48
|
+
<Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
|
49
|
+
<Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
|
50
|
+
</Transforms>
|
51
|
+
<DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
|
52
|
+
<DigestValue>#{digest_value}</DigestValue>
|
53
|
+
</Reference>
|
54
|
+
</SignedInfo>
|
55
|
+
}
|
56
|
+
signed_info_canonized = SignatureDfe.canonize signed_info
|
57
|
+
Base64.encode64(SignatureDfe::SSL.sign signed_info_canonized).strip
|
58
|
+
end
|
59
|
+
|
60
|
+
def self.digest_value something
|
61
|
+
inf_nfe = something.scan(/\<infnfe[\s\S]*?\<\/infnfe\>/i)[0].gsub(/>\s+</,"><")
|
62
|
+
inf_nfe_canonized = canonize_inf_nfe inf_nfe
|
63
|
+
Base64.encode64(OpenSSL::Digest::SHA1.digest(inf_nfe_canonized)).strip
|
64
|
+
end
|
65
|
+
private_class_method :canonize_inf_nfe
|
66
|
+
end
|
67
|
+
end
|
@@ -0,0 +1,81 @@
|
|
1
|
+
module SignatureDfe
|
2
|
+
class Config
|
3
|
+
include AbstractClass
|
4
|
+
|
5
|
+
attr_accessor :pkcs12, :pkey, :cert
|
6
|
+
|
7
|
+
attr_writer :password
|
8
|
+
|
9
|
+
def initialize
|
10
|
+
@pkcs12 = nil
|
11
|
+
@pkey = nil
|
12
|
+
@cert = nil
|
13
|
+
@password = nil
|
14
|
+
end
|
15
|
+
|
16
|
+
def inspect
|
17
|
+
super.gsub(/\, \@pass[\s\S]*?\>/,">")
|
18
|
+
end
|
19
|
+
|
20
|
+
def instance_variables
|
21
|
+
super-[:@password]
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
class SSL
|
26
|
+
include AbstractClass
|
27
|
+
|
28
|
+
@@config = Config.new
|
29
|
+
|
30
|
+
def self.config
|
31
|
+
@@config
|
32
|
+
end
|
33
|
+
|
34
|
+
def self.sign content, sign_method=OpenSSL::Digest::SHA1.new
|
35
|
+
self.test unless defined?(@@pk)
|
36
|
+
@@pk.sign sign_method, content
|
37
|
+
end
|
38
|
+
|
39
|
+
def self.cert
|
40
|
+
self.test unless defined?(@@pk)
|
41
|
+
if @@pk.is_a? OpenSSL::PKCS12
|
42
|
+
@@pk.certificate
|
43
|
+
else
|
44
|
+
@@cert.to_s.gsub(/\-\-\-\-\-[A-Z]+ CERTIFICATE\-\-\-\-\-/, "").strip
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def self.test
|
49
|
+
raise SignatureDfe::Error.new "You must be set up pkcs12 or pkey" if (config.pkcs12 == nil || config.pkcs12.empty?) and (config.pkey == nil || config.pkey.empty?)
|
50
|
+
if config.pkcs12
|
51
|
+
if File.exist? config.pkcs12
|
52
|
+
begin
|
53
|
+
@@pk = OpenSSL::PKCS12.new File.read(config.pkcs12), config.instance_variable_get(:@password)
|
54
|
+
rescue OpenSSL::PKCS12::PKCS12Error => e
|
55
|
+
raise SignatureDfe::Error.new "Wrong password for '#{config.pkcs12}'"
|
56
|
+
end
|
57
|
+
else
|
58
|
+
raise SignatureDfe::Error.new "Your pkcs12 '#{config.pkcs12}' is not a valid file"
|
59
|
+
end
|
60
|
+
elsif config.pkey
|
61
|
+
if File.exist? config.pkey
|
62
|
+
begin
|
63
|
+
@@pk = OpenSSL::PKey::RSA.new File.read(config.pkey), config.instance_variable_get(:@password)
|
64
|
+
begin
|
65
|
+
raise SignatureDfe::Error.new "You must be set up the cert if you chose use pkey" if config.cert == nil || config.cert.empty?
|
66
|
+
raise SignatureDfe::Error.new "Your cert '#{config.cert}' is not a valid file" unless File.exist? config.cert
|
67
|
+
@@cert = OpenSSL::X509::Certificate.new(File.read(config.cert))
|
68
|
+
rescue OpenSSL::X509::CertificateError => e
|
69
|
+
raise SignatureDfe::Error.new "Your cert '#{config.cert}' is not a valid file"
|
70
|
+
end
|
71
|
+
rescue OpenSSL::PKey::RSAError => e
|
72
|
+
raise SignatureDfe::Error.new "Wrong password for '#{config.pkey}'"
|
73
|
+
end
|
74
|
+
else
|
75
|
+
raise SignatureDfe::Error.new "Your pkey '#{config.pkey}' is not a valid file"
|
76
|
+
end
|
77
|
+
end
|
78
|
+
true
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
data/lib/signature_dfe.rb
CHANGED
@@ -1,6 +1,19 @@
|
|
1
1
|
require "signature_dfe/version"
|
2
|
+
require "openssl"
|
2
3
|
|
3
4
|
module SignatureDfe
|
4
|
-
|
5
|
-
|
5
|
+
class Error < StandardError; end
|
6
|
+
|
7
|
+
module AbstractClass
|
8
|
+
def initialize
|
9
|
+
raise "this is a abstract class"
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.canonize xml, canonize_method=Nokogiri::XML::XML_C14N_1_1
|
14
|
+
Nokogiri::XML(xml.gsub(/>\s+</,"><")).canonicalize(canonize_method)
|
15
|
+
end
|
6
16
|
end
|
17
|
+
|
18
|
+
require "signature_dfe/ssl"
|
19
|
+
require "signature_dfe/nfe"
|
data/signature_dfe.gemspec
CHANGED
@@ -23,8 +23,7 @@ Gem::Specification.new do |spec|
|
|
23
23
|
spec.metadata["source_code_uri"] = "https://github.com/thiaguerd/signature_dfe"
|
24
24
|
spec.metadata["changelog_uri"] = "https://github.com/thiaguerd/signature_dfe/blob/master/CHANGELOG"
|
25
25
|
else
|
26
|
-
raise "RubyGems 2.0 or newer is required to protect against "
|
27
|
-
"public gem pushes."
|
26
|
+
raise "RubyGems 2.0 or newer is required to protect against public gem pushes."
|
28
27
|
end
|
29
28
|
|
30
29
|
# Specify which files should be added to the gem when it is released.
|
@@ -39,4 +38,6 @@ Gem::Specification.new do |spec|
|
|
39
38
|
spec.add_development_dependency "bundler", "~> 1.17"
|
40
39
|
spec.add_development_dependency "rake", "~> 10.0"
|
41
40
|
spec.add_development_dependency "rspec", "~> 3.0"
|
41
|
+
spec.add_development_dependency "openssl", "~> 2.1.2"
|
42
|
+
spec.add_development_dependency "nokogiri", "~> 1.9.1"
|
42
43
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: signature_dfe
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Thiago Feitosa
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-01-
|
11
|
+
date: 2019-01-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -52,6 +52,34 @@ dependencies:
|
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '3.0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: openssl
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 2.1.2
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 2.1.2
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: nokogiri
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: 1.9.1
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 1.9.1
|
55
83
|
description: Assinatura digital de NF-e NFC-e NFA-e CT-e MDF-e BP-e
|
56
84
|
email:
|
57
85
|
- mail@thiago.pro
|
@@ -65,12 +93,19 @@ files:
|
|
65
93
|
- CHANGELOG
|
66
94
|
- CODE_OF_CONDUCT.md
|
67
95
|
- Gemfile
|
96
|
+
- Gemfile.lock
|
68
97
|
- LICENSE.txt
|
69
98
|
- README.md
|
70
99
|
- Rakefile
|
71
100
|
- bin/console
|
72
101
|
- bin/setup
|
102
|
+
- certs/certificate.p12
|
103
|
+
- certs/certificate.pem
|
104
|
+
- certs/gen.sh
|
105
|
+
- certs/key.pem
|
73
106
|
- lib/signature_dfe.rb
|
107
|
+
- lib/signature_dfe/nfe.rb
|
108
|
+
- lib/signature_dfe/ssl.rb
|
74
109
|
- lib/signature_dfe/version.rb
|
75
110
|
- signature_dfe.gemspec
|
76
111
|
homepage: https://github.com/thiaguerd/signature_dfe
|
@@ -96,8 +131,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
96
131
|
- !ruby/object:Gem::Version
|
97
132
|
version: '0'
|
98
133
|
requirements: []
|
99
|
-
|
100
|
-
rubygems_version: 2.7.7
|
134
|
+
rubygems_version: 3.0.1
|
101
135
|
signing_key:
|
102
136
|
specification_version: 4
|
103
137
|
summary: Assinatura digital de documentos fiscais eletrônicos
|