Estou tentando encontrar uma maneira de ignorar a verificação do certificado ao solicitar um recurso Https. Até agora, encontrei algum artigo útil na Internet.
Mas ainda tenho algum problema. Por favor, revise meu código. Eu simplesmente não entendo o que o código ServicePointManager.ServerCertificateValidationCallback
significa.
Quando esse método delegado será chamado? E mais uma pergunta, em que lugar devo escrever esse código? Antes de ServicePointManager.ServerCertificateValidationCallback
executar ou antes Stream stream = request.GetRequestStream()
?
public HttpWebRequest GetRequest()
{
CookieContainer cookieContainer = new CookieContainer();
// Create a request to the server
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(_remoteUrl);
#region Set request parameters
request.Method = _context.Request.HttpMethod;
request.UserAgent = _context.Request.UserAgent;
request.KeepAlive = true;
request.CookieContainer = cookieContainer;
request.PreAuthenticate = true;
request.AllowAutoRedirect = false;
#endregion
// For POST, write the post data extracted from the incoming request
if (request.Method == "POST")
{
Stream clientStream = _context.Request.InputStream;
request.ContentType = _context.Request.ContentType;
request.ContentLength = clientStream.Length;
ServicePointManager.ServerCertificateValidationCallback = delegate(
Object obj, X509Certificate certificate, X509Chain chain,
SslPolicyErrors errors)
{
return (true);
};
Stream stream = request.GetRequestStream();
....
}
....
return request;
}
}
c#
ssl
httpwebrequest
certificate
Joe.wang
fonte
fonte
Respostas:
Como existe apenas um ServicePointManager global , a configuração do ServicePointManager.ServerCertificateValidationCallback produzirá o resultado de que todas as solicitações subsequentes herdarão essa política. Por ser uma "configuração" global, seria preferível defini-la no método Application_Start em Global.asax .
A configuração do retorno de chamada substitui o comportamento padrão e você pode criar uma rotina de validação personalizada.
fonte
HttpWebRequest
. Se você estiver usando outros meios, deverá procurar na documentação como fazer isso.Para qualquer pessoa interessada em aplicar esta solução por solicitação, esta é uma opção e usa uma expressão Lambda. A mesma expressão Lambda também pode ser aplicada ao filtro global mencionado pelo blak3r. Este método parece exigir o .NET 4.5.
No .NET 4.0, a Expressão Lambda pode ser aplicada ao filtro global como tal
fonte
true
é algo que você pode fazer ao experimentar durante o desenvolvimento, porém é inseguro. Deve ser condicional.(HttpWebRequest)WebRequest.Create(url)
é perfeitamente válido, mas, na minha caixa,HttpWebRequest.Create(url)
ainda existe em um projeto direcionado ao .Net 4.6.2. Escolha do chef, mas neste momentoHttpClient
é provavelmente a melhor API a ser usada.Isso funcionou para mim:
Fragmento daqui: http://www.west-wind.com/weblog/posts/2011/Feb/11/HttpWebRequest-and-Ignoring-SSL-Certificate-Errors
fonte
Também há a solução de delegado curto:
fonte
true
é inseguro.Mencionou-se que antes do .NET 4.5 a propriedade na solicitação para acessar sua
ServicePointManager
não estava disponível.Aqui está o código do .NET 4.0 que fornecerá acesso a
ServicePoint
cada solicitação. Ele não fornece acesso ao retorno de chamada por solicitação, mas deve permitir que você descubra mais detalhes sobre o problema. Basta acessar as propriedadesscvPoint.Certificate
(ouClientCertificate
se preferir).fonte
ignore
eles, não confiam neles.ServicePoint
Eu não pode sempre confiar em todos os certificados SSL, nem ignorar todos os certificados , porque nãoServerCertificateValidationCallback
delegar em ServicePointAliás, essa é a maneira menos detalhada de desativar toda a validação de certificado em um determinado aplicativo que eu conheço:
fonte
Em vez de adicionar um retorno de chamada ao ServicePointManager que substituirá a validação de certificado globalmente, você pode definir o retorno de chamada em uma instância local do HttpClient. Essa abordagem deve afetar apenas as chamadas feitas usando essa instância do HttpClient.
Aqui está um código de exemplo que mostra como ignorar erros de validação de certificado para servidores específicos pode ser implementado em um controlador de API da Web.
fonte
Com base na resposta de Adam e no comentário de Rob, usei isso:
que filtra um pouco a "ignorar". Outros emissores podem ser adicionados conforme necessário, é claro. Isso foi testado no .NET 2.0, pois precisamos oferecer suporte a algum código legado.
fonte
CA5386: As ferramentas de análise de vulnerabilidades alertarão você sobre esses códigos.
Código correto:
fonte
Para o núcleo .net
fonte
Expressa explicitamente ...
fonte
Adicionando às respostas da Sani e blak3r, adicionamos o seguinte ao código de inicialização do meu aplicativo, mas no VB:
Parece fazer o truque.
fonte
Dica: Você também pode usar esse método para rastrear certificados que expiram em breve. Isso pode economizar seu bacon se você descobrir um certificado que está prestes a expirar e pode consertá-lo a tempo. Bom também para empresas de terceiros - para nós, é a DHL / FedEx. A DHL acabou de expirar um certificado, o que está nos ferrando três dias antes do Dia de Ação de Graças. Felizmente, eu estou por perto para consertar ... desta vez!
fonte
ProwlUtil.StepReached
?Várias respostas acima funcionam. Eu queria uma abordagem que não precisasse continuar fazendo alterações no código e não o tornasse inseguro. Por isso, criei uma lista de permissões. A lista de permissões pode ser mantida em qualquer armazenamento de dados. Eu usei o arquivo de configuração, pois é uma lista muito pequena.
Meu código está abaixo.
fonte
Versão Unity C # desta solução:
fonte