如何使用mono解析OSX上的SecureChannelFailure

时间:2017-01-24 12:12:26

标签: c# .net macos f# mono

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

let baseUrl = "https://geocoder.cit.api.here.com/6.2/geocode.json?searchtext=1701%20McFarland%20Blvd%20E%20Tuscaloosa%09%20AL&app_id=<Some app id>&app_code=<Some 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

1 个答案:

答案 0 :(得分:3)

使用Mono 4.8 + ,您可以在运行基于CIL的MONO_TLS_PROVIDER之前将环境变量btls分配给.exe

export MONO_TLS_PROVIDER=btls
mono someFSharpAssembly.exe

通过Xamarin Studio / Visual Studio for Mac将其分配给运行配置:

enter image description here

如果您获得HttpRequestException

Error: TrustFailure (Ssl error:1000007d:SSL routines:OPENSSL_internal:CERTIFICATE_VERIFY_FAILED) ---> Mono.Btls.MonoBtlsException
  

这意味着您没有新格式的证书。运行“btls-cert-sync”工具将现有的根证书转换为新的文件格式。如果“btls-cert-sync”抱怨“旧信任存储不存在”,您首先需要告诉Mono如何查找这些证书,本页描述了如何执行此操作: