如何使用mono解决OSX上的SecureChannelFailure问题

我正试图在单声道上使用.NET(F#)访问https://geocoder.cit.api.here.com 。 我正在使用FSharp.DataHttp帮助程序,使用以下代码:

 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如何查找这些证书,本页介绍了如何执行此操作: