如何使用mono解决OSX上的SecureChannelFailure问题
我正试图在单声道上使用.NET(F#)访问https://geocoder.cit.api.here.com 。 我正在使用FSharp.Data
的Http
帮助程序,使用以下代码:
let baseUrl = "https://geocoder.cit.api.here.com/6.2/geocode.json?searchtext=1701%20McFarland%20Blvd%20E%20Tuscaloosa%09%20AL&app_id=&app_code=" let res = Http.RequestString(baseUrl)
在OSX Sierra(10.12.2)上以单声道版本4.6.2为我运行这个产生SecureChannelFailure
。 我该如何解决这个问题? 我试过mozroots --import --ask-remove
但是没有帮助。 在~/.config/.mono/certs/Trust
。
我甚至试图绕过检查,因为我只是在调查API,但这也不起作用。 我试图绕过它的方式是:
let callback = Security.RemoteCertificateValidationCallback(fun _ _ _ _ -> true) ServicePointManager.ServerCertificateValidationCallback <- callback
使用Mono 4.8+,您可以在运行基于CIL的.exe
之前将环境变量MONO_TLS_PROVIDER
分配给btls
:
export MONO_TLS_PROVIDER=btls mono someFSharpAssembly.exe
通过Xamarin Studio / Visual Studio for Mac将其分配给运行配置:
如果你然后得到一个HttpRequestException
:
Error: TrustFailure (Ssl error:1000007d:SSL routines:OPENSSL_internal:CERTIFICATE_VERIFY_FAILED) ---> Mono.Btls.MonoBtlsException
这意味着您没有新格式的证书。 运行“btls-cert-sync”工具将现有的根证书转换为新的文件格式。 如果“btls-cert-sync”抱怨“旧信任存储不存在”,您首先需要告诉Mono如何查找这些证书,本页介绍了如何执行此操作: