From b2fa2fd7a15acd32d8f395817f417d3e04cf7360 Mon Sep 17 00:00:00 2001 From: Gerson Felipe Schwinn Date: Fri, 7 Jun 2024 14:09:36 -0300 Subject: [PATCH] =?UTF-8?q?Incluindo=20manual=20para=20cria=C3=A7=C3=A3o?= =?UTF-8?q?=20de=20certificados=20auto=20assinados=20de=20teste?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Também incluí certificados de teste. closes #1055 --- .../GerarCertificadoAutoAssinadoParaTestes.md | 90 ++++++++++++++++++ phpunit.xml.dist | 2 +- tests/CertificateTest.php | 25 +++++ tests/bootstrap.php | 4 + tests/constantes.php | 3 + ...t_cnpj_06157250000116_senha_minhasenha.pfx | Bin 0 -> 4051 bytes .../certs/cert_cpf_90483926086_minhasenha.pfx | Bin 0 -> 3875 bytes 7 files changed, 123 insertions(+), 1 deletion(-) create mode 100644 docs/GerarCertificadoAutoAssinadoParaTestes.md create mode 100644 tests/CertificateTest.php create mode 100644 tests/bootstrap.php create mode 100644 tests/constantes.php create mode 100644 tests/fixtures/certs/cert_cnpj_06157250000116_senha_minhasenha.pfx create mode 100644 tests/fixtures/certs/cert_cpf_90483926086_minhasenha.pfx diff --git a/docs/GerarCertificadoAutoAssinadoParaTestes.md b/docs/GerarCertificadoAutoAssinadoParaTestes.md new file mode 100644 index 00000000..43d8c449 --- /dev/null +++ b/docs/GerarCertificadoAutoAssinadoParaTestes.md @@ -0,0 +1,90 @@ +# Gerar Certificado auto assinado + +## Para um CNPJ +1 - Gerar chave privada: +``` +openssl genpkey -algorithm RSA -out private.key -pkeyopt rsa_keygen_bits:2048 +``` + +2 - Crie o arquivo de configuração openssl.cnf: + +``` +[ req ] +distinguished_name = req_distinguished_name +x509_extensions = v3_ca +req_extensions = v3_req + +[ req_distinguished_name ] +C = BR +ST = São Paulo +L = São Paulo +O = Sua Empresa +OU = Unidade de TI +CN = 05.730.928/0001-45 +emailAddress = email@suaempresa.com.br + +[ v3_ca ] +subjectAltName = @alt_names +basicConstraints = CA:TRUE +keyUsage = keyCertSign, cRLSign + +[ v3_req ] +basicConstraints = CA:FALSE +keyUsage = nonRepudiation, digitalSignature, keyEncipherment +subjectAltName = @alt_names +2.16.76.1.3.3 = ASN1:UTF8String:05730928000145 + +[ alt_names ] +email = email@suaempresa.com.br +``` + +3 - Gere o certificado autoassinado: + +```bash +openssl req -new -x509 -days 3650 -key private.key -out certificate.crt -config openssl.cnf -extensions v3_req +``` + +4 - Converta para o formato PFX: + +```bash +openssl pkcs12 -export -out certificate.pfx -inkey private.key -in certificate.crt -certfile certificate.crt -passout pass:minhasenha +``` + + +## Para um CPF + +Mesmos passos anteriores, exeto o arquivo openssl.cnf será esse abaixo. +Note que o oid 2.16.76.1.3.1 é composto por uma data de nascimento seguido do CPF. +2.16.76.1.3.1 = ASN1:UTF8String:ddddddddccccccccccc +Onde d é data de nascimento e c é o cpf somente números. + +``` +[ req ] +distinguished_name = req_distinguished_name +x509_extensions = v3_ca +req_extensions = v3_req + +[ req_distinguished_name ] +C = BR +ST = São Paulo +L = São Paulo +O = SpedNfe +OU = Unidade de TI +CN = 904.839.260-86 +emailAddress = email@suaempresa.com.br + +[ v3_ca ] +subjectAltName = @alt_names +basicConstraints = CA:TRUE +keyUsage = keyCertSign, cRLSign + +[ v3_req ] +basicConstraints = CA:FALSE +keyUsage = nonRepudiation, digitalSignature, keyEncipherment +subjectAltName = @alt_names +2.16.76.1.3.1 = ASN1:UTF8String:1210198506157250000116 + +[ alt_names ] +email = email@suaempresa.com.br + +``` diff --git a/phpunit.xml.dist b/phpunit.xml.dist index bc4d4807..552bb022 100755 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -1,7 +1,7 @@ assertSame('06157250000116', $certificado->getCnpj()); + $this->assertSame('05/06/2034', $certificado->getValidTo()->format('d/m/Y')); + } + + public function test_certificado_pf(): void + { + $conteudo = file_get_contents(TESTS_FIXTURES . '/certs/cert_cpf_90483926086_minhasenha.pfx'); + $certificado = Certificate::readPfx($conteudo, 'minhasenha'); + $this->assertSame('90483926086', $certificado->getCpf()); + $this->assertSame('03/06/2034', $certificado->getValidTo()->format('d/m/Y')); + } +} diff --git a/tests/bootstrap.php b/tests/bootstrap.php new file mode 100644 index 00000000..eb04cdc6 --- /dev/null +++ b/tests/bootstrap.php @@ -0,0 +1,4 @@ +2S~j=G4fuojP6#b zS(kA}!>Ixvp9D{woQUNAuHu6T@xH8%hB&cePMo>piE1<7smLY>*;ijm^=0p|iq?`Au8*~$-O&~-YoFNi-qkU& zgulA-PDR@S$tyXomMgQUlQeiBq1HHcqh{KjMOR|9E103pT)m)d7A@5?zs#l_@3_9I zPyYo;SBrrcnjQihkS9!4fqvr*1I;q2 zv~^FyE z*KyWtRy@eqpM3IH z3u*fNTnti4xa^!edsjE0bMk4Z_i1FWE;~;eB)2WwVl_SKp|i>MH9!5yN0kh2{ZXSIE3R=m zjy_wDI7907e)MBz6sVz25psc!FWa{ZvI7&?o%xE=Gepr`XNJfugQedad#<=p{y?*c zWF>(it7HlJ zh190)ts80f64~#XQBa@3*OCBJEq^(M^e;ko&`Ko^{1xLT4Jut`l>}{bP7Y} zMvJB9KK7e9r z)M)Br#h!YzPKi&8D7AscM}h$DMlI3-qFS|E*PE^jty%-vIAY}H2~9i2=M*0QOLgLdm=R%7|+gvk`?X z>%Tkw=>oU5sL4iKcYw4Z-c{pJvPrA+;z{!`@0;(MBY@&7wsu`Fw;WYE}ZCaa1xk{V~yM=A3PJvcMwn&vHvIQCI5D*AwE{m|j~WY+>6T!Z0) z&mFM7w3w`KJPTfLT4i#kSkK#}A05`mIB+~xnjBx^69yrDb|XxKXLoJhATL z8nBAZJ|2DJX6ALY55jK`fX3X_iF2HN>yoh&GLPSgKMCNfR6i|W@ZG~ z$IF=-tX#hi0-f=}WrL*yJy-KDeoItxgGu&;G4el4u1-V#y2oE~8bo{!IOuI?NyXpD z=|7s6FjadytXoO1N-hh~iNgjg@vBRR?bWtZ>6Q8-IuSHP5bYpLPD^202yCM@4F@Tt znBh;1Z)3q^V2tx=7T(1EXuPYL?wIc(LcPh{uJ= zCJ)Hk-lRh#qU8aG1NUrF>gL3`e(%ig27GArYl>vi*9>5Rxkzia6FqA#K`gLKrX{`Y zKlqF$M5OL%3oBp} zQ_U26W;vnAM!hoPB*&zYu@A_1V7BOt*ly9py3Be+c`Df=A$8SkV%qMoB3dSvD5q*> zxdOBMNvXdMbHBevd&DGz(@yKWW@On!F~V2PHmmmd-uzH`tAkbLE{?hF@TT`QSyX81 z zC;4(4VtIkpV1(Q2Xj#5`7l0Ew_F>sH6@F<)ep=xKgwMqL)ehNrVHD(Of#bMjZowbN zjh@MV;NXTI>1kcgkt2z_(|b=yub;>b(F_L9d*ubi?`J?|#4EV_g=*YDFz|S7#syE# zz5IHqUOH^%Dtw5IK0B@)KdeZ>bmmr}uGQpPB!kf&S$L$MJuC^kb>*653r3vL=uBs! zAQOeJ&uKe{T2$p}wY{wsI%w{7P(M6`e;Lf`II+yfB@@sQ%&5XERd$|Dx=_G}zfirt zp|U3t*qE89Y#fRIxe&LVl*}X=Gr3yG4x{hEzaZw?UJ;uqYJyscz=dIGAbSR1(tgT7 zPOM1LnhL#t##xM!k?CW2ocx&VqL(FmUd!s}ED~>8Hk(-`*k=_Fi6d_q+1!xg(OlYC zF3+U1afy*@pY^t61b#PxBU0{rQt4`UI$s>hB)!NZ;XkGJPyXVx1}D|M){ePR!8!%AW#^=06+3q+IO=zF_gmRl;wZwze>m;G;71q+ zL=gu4u><~$FA>@QGa)%C0RK-Y|HqX1U!b?ctUw-8y1*QY?Q@vjWn%oFpeHmkq4(u> zSNO@&@-}YwOb3VpPN(}K(NQ7#Cg1Akla9^BD4L&HVMn@zdaTC!g(ogN@B4nQg3S#v z3hoxa=3V4y<(YJ6m^G;KE}E<59HHM%rntfy12)fe!{>?Dyo9W!YXJ;`Utgx0NKB?^ zl3C`#oxPK_8dT-`AMNPL+QCSAVV2x}5}62=7iWkklaOUMar_zi1PbCi4qT%TyutP% zCGB-ECrOnFxTfr*G{05rTA=mi(qD?okh<<^plJOwHNWqMGpV7Zrp+B~w{vtrPcc;& zSJ5$UD^35ILGT^rEjhP>`Z=3> zx|1p|t=9qdGQVqU$9;@R)gxik4~{LN-{KPF2oaWjKRV8MRH`JBHaf@aRCUi+R3gTa$z@SidygQ=KF!D793e=~uia3%` zz%J6fq-WtEmUud4F04`hTA-o}ga9RvJgmwx;jJaxxLu3G1iX^nh~?Qpb$L?%vJ z>8f)-PBIr>G+8TPedcIE{)VV`YX%VAfnzH`wdXC`SsD77DauV1i>BmnTyZ@b>BcsL zl!rkMB!#xwr<;~c8i_y2jlCnrx6NV}%UFo;(j2lwD0ui<$Iv)`7D@?L zNBG#c4GgWZVh6M&)g-t&DK8h>`*|X<2sKuP)+p}^60<%Qf2h#JL(%XeY{BidIu-ji ziy#a1NcS~XI4QZhE0u16!ddF3$%$asN#^6PZ&F(-XTsB}E%)}cO$M+Yq5ZC)LCz39$yn(W5Y{Gev*Z(MHNG_p>r1wBVz#H&%)v6qm9Ro6PdVEHDa4`DpuD&M;Q zoYFKdJj%2d#n=HP$+PmpFXh$JL(CBoDUtI{M!U(r^T=NL1!F>1u_WRYnE%F1=d**p zp7MiXePZYc#OO9zr{f;6Hw~Wy>!o6LyWbJgddZ_tin@CmEQiVA z>F)ge*8i{fz5FiDI&1HJaqjkd4h%_k4;N6nsR@~|MH z%stO^nUw^p_r_C1+2ve)Fq0G&ma;rZtVVA&<9 z3V+X0UbwIB+KC2^1nvRX5>un`H?uA=euTsSI){X=yi}gRFBW$id9j=IZEj=J&zbc2 zZ4fU~eJmg^&V-hFX;wmU=Z!)I?u`IVm=rRoji8Q|cZ`Z9i|u%UaJ{VL2d$1tv(rOF znJBOmacT1BQ_Cm&xAl7QkJOJNR)aX5+ll5~l=uK6st)ZgJr=d93MeDH^AhM#`NFZi zhAVWkbtLocVF}MgJ_+H?&E4_maJ8v157Z$HV){_uzH2ufLRWD)BPrb9xHMb84Y?KA z;-d2?b4b(OQp{nWW4NBygEfC~x&eX|@;*a^Ca1;1_Nd3=c)4QQbWQ6?9Tb&#S@17} zg|03?NqIOW%wBxZ>?9DPcVup4C=>&}8SGBP;dOqOOLFB`=Wp<8TC>wYkeLj)q6f>q zvfP{FgBu>Ho^L~wN4au;;+4Ld$>q*GkT5t*^@YuBoxvaHuJ95Q9)d9CyT3St824_h zin)S^F=5pWj)`kFA$Z9EHx7}K&4ldl5Eh*zl!sa@27UUK=u{ryiJqU|>t}bIFPMhz z6EJhs=wa`;=;$-$@u~G8Bbc@tho48%O4W@Jv>D%n+M!d0KQG;W^TFnY_wx{FcV{sM zt8bqaDS=xc-hI|Q{S?dv22RjZ3I@4wX?NIB4=kCH8nrwv~JtdXQmM5WBC0px8z56%oQMQSx~Gfk*dWt2Tb7q|_uTgm2N z9i-|>c;TM7FwvN1u-knd?1A&%#sOq*%n>s`2?>%J0tA10w$FtTW* zcp|HYyQc3LyA6*U<)oF8?t4#3kM&c}pAC9B&1|HpDA_&0v?4ysF#2|D{OT7E{fit8 zG)&)4kG^tC6ky+^<-zL{-`wUIksx;@qAX8Nn)H2v1WerQTkzDxZqnktYx73N2Zp;H z?AL7;PN3boa_QM8?>(70H3b(Z9v7Q(eU-YrYE;(ia2-;W*0Rrxw2~=W;^(j3>8W@S zj%g1Ouhn&Gv0iiVr`vl)^OSHGfYD8+M1Y6CUn<`%r-{tk;)=iFiv+Bw8D=nXfFHjG6A0FO|*o}1X;uB0o~MHmWEqj*W%@qwd)<%!7tYjyXx z^{1pY;;L2!l^^NW+W606s=u__6hDkhlh%ynYG9AhO!PL}zc75!st3FXKBs~yHUT)r zc0`NIBrZiE`25x!iW6c<{`+_}dSQpTvJGs+J#24!{9lCX2Q=+xrNCr*OHrn)w_{FT zc1eaf%s?I>B37gy#&Z8fg@xQXRo^8xFEIqmqW&>RI|8)0M2x+?yjC{j7dQZX?PN)3 z#(Xg73F}v=lf>Kes`2;Eq#5`a823BX#u57ocEWbrFS;0K)Fm048hr1=>H0}$mfGvn z!G*vlp7~(TCFzeosISIi{OfL+exv={xU&O-$Av5q@D6mUoBXD&GBPxH^f5x!vmJtI z)(27NpqctrT>H{zII6FbTMXsAcII_g9~JJRv!k_2RLbskM1|7IwS0Xo(wiMA+NE+9 z4H2OmblIu0Yd1s)6j)^CUSbQpXjoabHqwt>4Wz|*=SlJ!7T9Q{Cf3VAthosng!}Gb zvjlV}HNw8f1T^9NbYx9yQJK%pDTMd*_ybwQgfdhTA&cirS>M{^3$1+hF z2xBR2&gKlZ*Lr$8C-fjeYEwWKb#Yu`sx%BZO{Y?k5ooF}CEPURdVhFLu!>kM^|fl+ zDE3&MEVf-eyKpg9 zsQB-Pdmq5l3i&q3oI8Eo0`AqSRRr%*N zN&(v3j`Wmgc(S37$nVNlC#Xn|0lh(Nhz5Sh=>3G|$AXrN%zA25V9bPKns)M%Q(i&L z0Y>^%9tnype_uz4eJ6&P`GB>w1Rpp*RxVn(swsTr+m2VAr>AnicWMRMIG>^x8mW2A zAVfgDefXul*C3xj>vYBXaN8G#Bux5;d;SYjgrPtrVbEXO@9%gKk^etqQIG-f|Atb3 zP4WK)PF`KJ%du+4j3TubXz5E5)&B`j-`dx>T_5K^p^o$Cz)gRN1tNhXJ1BJNc1H5> z$3}{cJOZH%z%bV9QTpLKb(cv8h@dr?WsI6%ia~beFsKaESbh>e+H9~<+v@;mYAXr$ zu~^g?XRGa-S(TQ7Kp@uV4PCEl&l=%FmmR__0KplD zD$iaS>8kBTsxci?lWTF1u84 zH}x`pF(R2On5oi4;x|Wt%8VgV&h#=vk}0)Gr_ynTv;Hb8&o|-uprf`#lQoLv#3A34 zD7jF^4JgL4w8xDnj#-@+>iipaxc50rRdQ%?9x>5U{%vS(ija!QC`EkI+gPwQpsoU$ z2@2_T6iX@wCS+}_wbihiFw<4fSdKFS<$d089i<&xHmfp_6N54Dx`B^bwt@;2b_pWT z=U!j>$?j|sk~%vMCHdEfSVP}|Zp~|ES&ZPSC!xiDcv9}Y^}ZX)2awjv*Q-B>ARK*c z&lGYrq~rhztcsJWvE7Ssz}uY0qTucs^#tYvw0LF8_|ggS8SAtDo~SLXH`}OB;;yw9 zM4$op5fOI8x~H%Ejor^2+!~lO5x_q5*t{mYTlCaWT?|3&SJWFmEGnSbjO0lzH?#xz zhko*Y;NHKS=x%uAx?@CbS1$6?5m6i`5YUl6#%m96oXOIII-_2MSFYs`%-(>sJ*jV& zbdpUR0$JhEz5&W-^>L+{j6tIudY#IzcZj=(MO+Ge~uo}7YCfz544;Yls!q4rmxLK zN1EH>F_;S4EH9X2kBVPrazYrn9P`qO06#2`>Rp8Ma)qfXJ=!C0UH6ryswEip&z{zi zNg!XERt0|lqBqx1>p80`y9p~VFzRJWKREV5YQ%P-{@gCUM6#T^_Ei-~N{9fO z3%0prTeYO7C0}=wpKHdC{Zsh4Cvb;ShgFaB5AuNOI7NsysA<}r^=_K*8}I#}54(3r zzOlVKqHR5yrQ)P@b=n=HAEFu@8qc@diWb&>E$FmBn@mExthVW&8e=KY%A43-M`bmO z`n=Ca%pmj{5c*b}Ea&Bot$Te$11ea-K%q-9`um?`SG7O>I?qU_-rqdZ{VsYCGih&i z>JVBkQ8g|$>3n}U+BZD!p-31V81S*Q6cs{IeKJwI0f literal 0 HcmV?d00001