{"id":13338006,"url":"https://github.com/willsbctm/mtls-teste","last_synced_at":"2026-01-16T07:35:14.975Z","repository":{"id":43460170,"uuid":"511334901","full_name":"willsbctm/mtls-teste","owner":"willsbctm","description":"Repo com exemplo de mtls","archived":false,"fork":false,"pushed_at":"2022-07-07T15:07:52.000Z","size":254,"stargazers_count":5,"open_issues_count":0,"forks_count":2,"subscribers_count":2,"default_branch":"main","last_synced_at":"2024-10-23T20:11:39.276Z","etag":null,"topics":["certificate","certificate-authority","dotnet","mtls","mtls-request","nginx","openssl","tls"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/willsbctm.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2022-07-07T00:40:46.000Z","updated_at":"2023-12-19T17:14:03.000Z","dependencies_parsed_at":"2022-07-15T03:00:46.709Z","dependency_job_id":null,"html_url":"https://github.com/willsbctm/mtls-teste","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/willsbctm%2Fmtls-teste","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/willsbctm%2Fmtls-teste/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/willsbctm%2Fmtls-teste/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/willsbctm%2Fmtls-teste/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/willsbctm","download_url":"https://codeload.github.com/willsbctm/mtls-teste/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":243000881,"owners_count":20219759,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["certificate","certificate-authority","dotnet","mtls","mtls-request","nginx","openssl","tls"],"created_at":"2024-07-29T19:15:16.909Z","updated_at":"2026-01-16T07:35:14.936Z","avatar_url":"https://github.com/willsbctm.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Instalação\n\nPara executar os exemplos será necessário:\n- Terminal shell\n- dotnet sdk 6.0\n- docker\n- openssl cli\n\nAbrir um terminal no diretório [/src](https://github.com/willsbctm/mtls-teste/tree/main/src) e seguir os próximos passos\n\n## Configurar host\n\nApontar o endereço test.localdev.me para 127.0.0.1 na sua máquina\n\n## Gerar Certificados\n\nRodar [gerar-certificados.sh](https://github.com/willsbctm/mtls-teste/blob/main/src/gerar-certificados.sh) para gerar os certificados e chaves no diretório [/certs](https://github.com/willsbctm/mtls-teste/tree/main/src/certs):\n- server.crt\n- server.key\n- ca.crt\n- client.crt\n- client.key\n\n```\n./gerar-certificados.sh\n```\n\n## Criar servidor\n\nRodar [docker-build.sh](https://github.com/willsbctm/mtls-teste/blob/main/src/docker-build.sh) para gerar a imagem nginx:mtls que terá configurado o certificado do servidor:\n- server.crt\n- server.key\n\nE também terá a autoridade confiável para certificados do cliente:\n- ca.crt\n\nEssas configurações estão no arquivo [nginx-setup-mtls.conf](https://github.com/willsbctm/mtls-teste/blob/main/src/nginx/nginx-setup-mtls.conf)\n```\n./docker-build.sh\n```\n\nRodar [docker-run-servidor.sh](https://github.com/willsbctm/mtls-teste/blob/main/src/docker-run-servidor.sh) para iniciar o servidor nginx expondo a porta 443\n```\n./docker-run-servidor.sh\n```\n\n## Realizar chamada do cliente no servidor\n\n### Via curl\nRodar [run-cliente-curl.sh](https://github.com/willsbctm/mtls-teste/blob/main/src/run-cliente-curl.sh) para realizar uma chamada curl informando o client.crt e client.key\n```\n./run-cliente-curl.sh\n```\n\n### Via dotnet\nRodar [run-cliente-dotnet.sh](https://github.com/willsbctm/mtls-teste/blob/main/src/run-cliente-dotnet.sh) para realizar uma chamada utilizando HttpClient e informando o client.crt e client.key\n```\n./run-cliente-dotnet.sh\n```\n\n# Resultado esperado\n\n- Chamar o servidor e não informar certificado de cliente:\n\"400 No required SSL certificate was sent\"\n\n- Chamar o servidor e informar certificado do cliente inválido:\n\"400 The SSL certificate error\"\n\n- Chamar o servidor e informar certificado do cliente assinado pela autoridade configurado no servidor:\n\"mTLS fechado com sucesso!\"\n\n# Conceitos\n\n\n- TLS x mTLS\n\n[\u003cimg src=\"imagens/tls.jpg\" width=\"400px\"/\u003e](imagens/tls.jpg)\n[\u003cimg src=\"imagens/mtls.jpg\" width=\"396px\"/\u003e](imagens/tls.jpg)\n\nAlgumas questões interessantes:\n1) O certificado do servidor não tem nenhuma relação com o certificado do cliente.\n2) O servidor aceita comunicação com o cliente se o certificado do cliente for assinado pela autoridade de certificados de cliente configurada no servidor.\n3) O servidor aceita qualquer certificado de cliente assinado pela autoridade configurada.\n4) O certificado do cliente provavelmente será assinado por uma autoridade interna da organização para que os certificados de cliente aceitos pelo servidor estejam sob controle.\n5) Para realizar uma chamada dotnet utilizando HttpClient, é necessário:\n```c#\nvar certificado = X509Certificate2.CreateFromPemFile(\"client.crt\", \"client.key\");\nvar handler = new HttpClientHandler();\nhandler.ClientCertificateOptions = ClientCertificateOption.Manual;\nhandler.ClientCertificates.Add(certificado);\nvar client = new HttpClient(handler);\nvar resultado = await client.GetAsync(\"https://test.localdev.me/index.html\");\n```\n\n\n# Em resumo\nO mTLS tem o fluxo normal do TLS somado a uma validação por parte do servidor do certificado informado pelo cliente através do ca root configurado no servidor, dessa forma o cliente também consegue provar ser quem ele deve ser para o servidor.","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwillsbctm%2Fmtls-teste","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwillsbctm%2Fmtls-teste","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwillsbctm%2Fmtls-teste/lists"}