|
|
2001-12-20 microsoft* `+ ^# w# M8 T' U; `1 `; {; R( M
3 s- ^" |7 d: K6 F: l K ^6 Y9 Q1 `* z
如果您计划通过Internet销售 MFC控件和ATL 控件,您应该将其打包成签署的小巧(Cabinet -CAB) 文件。签署文件确保用户下载您的控件时源代码是安全的。一个CAB文件包含一个您的控件及其安装信息(比如,都需要哪些动态链接库DLL和OCX一起安装)的压缩版本。
5 L' p# A6 K' o$ ]# \4 J+ O# g! s1 S* L/ U& |
创建和签署CAB文件的工具包含于Visual C++ 5.0 光盘中的 CAB&SIGN 目录下面。 该目录下的公用程序在您安装Visual C++时并不会自动地一起安装,因此您必须将CAB&SIGN 目录下面的内容拷贝到您的硬盘驱动器中。 ) ^4 f! W+ b. l' p
! y/ l0 V3 V4 w/ j1 b- O u' L
在签署文件之前,您需要有一个软件出版商证明书(Software Publisher Certificate)。您必须向证书发放机构(Certification Authority)申请自己的证书。利用CAB&SIGN目录下面的工具,您能够创建一个用于测试的测试证明书,但是该证明书不能用于签署发售的代码。有关申请软件出版商证明书的信息,请参考步骤 1 。
* z ]! u+ A2 X6 w b5 @5 Z+ P& [6 f+ y& T0 R; \' O
下面是创建签署CAB文件的步骤 : % k7 E% b9 k1 u& e
+ b$ ?$ o& l: v6 C* F 1 获得一个软件出版商证明书 (您只需要这一次申请就可以永久使用) 2 Z4 {. H+ Z2 N& i( M9 c8 k7 b
' I( m/ x8 Y* Z! E; Z+ W, h" L
2 创建 CAB 文件 - Z& R2 \) M. C% }
7 d2 l9 h9 \: s' ]; U$ Z: {* v% ` 3 签署您的文件 m5 Y- t2 O0 ?, N h( B, n
f! ~) s8 _4 d$ ]. I! G+ p$ A6 R 4 将签署过的 CAB文件嵌入一个Web页(可选项)获得一个软件出版商证明书
/ p# S0 _' p* K6 @! i( v0 J; l+ @
在签署文件之前,您需要有一个软件出版商证明书(SPC)。为此,您必须向证书发放机构(Certification Authority)提出申请。在申请过程中,您必须生成一个密匙对,并向证书发放机构提供证明信息,比如说您的名字、地址以及公共密匙。而且,您必须作出具有法律约束力的誓言:您不能也将不会发布您知道或者应该知道其中包含了病毒的软件,或者是恶意破坏用户的机器或代码。 9 m1 ^; w# E! K& P7 a! o) ]
5 W; h- E, d: Q; p1 y 有关如何得到软件出版商证明书更详尽的信息,请参考Signing Code with Microsoft's Authenticode。若要申请该证书,请参考 Digital Certificates for Authenticode ;若要创建一个测试证书来测试签署文件,请参考Making A Test Software Publisher Certificate.
8 J: r0 o& L9 l7 D/ s( }6 i
# s- T* o2 I: w5 ~% D+ V. r 证书发放机构生成一个符合工业标准X.509证书格式(包含版本3扩展)的软件出版商证明书 。该证书确定并且包含您的公共密匙,并以证书发放机构存档作为参考,把一个拷贝以电子邮件的方式返回给您。收到该证书之后,您应该在所有要发布的、用私人密匙签署的软件当中,包含一份该证书的拷贝。
/ h/ ^- c6 k) y- f7 f8 Q, m# I7 F& S1 D
获得一个软件出版商证明书& B9 X. |4 p; c& P) Z+ V1 b
& _" G% E$ r( i) \; d' {- I- o
您可以使用Visual C++ 5.0 光盘中CAB&SIGN目录下的 MAKECERT和 CERT2SPC 公用程序,做一个测试软件出版商证明书。注意,该测试软件出版商证明书对真正的软件发布无效,但是能够被用来测试您代码的签署。
8 [0 m: `* ]4 F" S% v- u* e/ `
: V( }1 A: l6 G9 |8 O' v, s" u 比如,要做一个私人密匙文件MYKEY.PVK 和一个公司证书CERT.CER,则运行公用程序MAKECERT,其命令如下: ; r: ]) m, {% j! S5 w* S
# k; c M( ^& J' t$ S! E; b
C:\CAB&SIGN\MAKECERT % T. Z5 i; ?$ h9 L9 L; N
-u: MyKey ; U" h$ C8 r' O C' o
-n: CN = MySoftwareCompany
* k: E b& y6 Q) D! a-k: MYKEY.PVK CERT.CER
v, ?3 j {! V' W( v9 H) a& R" `9 X, p4 M6 r
MyKey 是您的密匙名,MySoftwareCompany 是您的公司名。注意公用程序 MAKECERT 在命令行选项中区分大小写,因此您必须使用小写的-u、-n以及-k;-n选项的值必须是大写的CN=。
) q- t' l5 h" Y$ Q: M$ B U
; V6 R+ `" h6 B) n' g 做一个名为CERT.SPC测试软件出版商证明书,则运行公用程序CERT2SPC,命令如下:
4 T! R7 t$ ?' e* g3 R2 a0 ?) c% ~
5 u. _$ O. g! w- EC:\CAB&SIGN\CERT2SPC C:\CAB&SIGN\ROOT.CER CERT.CER CERT.SPC
1 e6 e% \$ d9 |4 D- Z* N
( v; x! U5 A8 I& [/ U 注意CERT.SPC文件是利用您刚使用MAKECERT创建的CERT.CER文件以及CAB&SIGN目录下面的ROOT.CER文件创建的 。 $ z( u6 F5 D1 _
: O8 Z$ d- j' U; c6 R0 N; J 创建一个 CAB文件
$ H; K1 k+ v& h
- C% f6 u1 U$ s+ c5 P& K: o1 I 这一部分描述如何创建能在互连网上分派ATL和MFC组件的CAB文件。如果您要了解有关CAB文件的更多信息,请参考Cabinet文件参考书目(File Reference),该文件位于平台软件开发工具包(Platform SDK,包含在Visual C++ 5.0联机文档中)的设置和系统管理服务(Setup and System Management Services)部分的\Setup API\Overview\Cabinet Files目录下面。
0 n; {. [; I |. ]
7 [$ ^4 N# U1 [7 F* V7 u; g5 ^6 a0 S 创建一个 CAB文件: ' d) u" z4 S7 N' [* L" m6 C
3 f+ b) q' v8 C" s 创建一个INF文件。 & w' [) ~. l L: [6 Q
x4 O* p$ D! [ ]/ v6 Q* r 运行公共例程CABARC(在光盘上的CAB&SIGN目录中)。例如: 7 \0 _. X% @" t3 z e+ L8 j$ w
+ {" D- }4 |$ M4 v5 [& u, C7 L% P# ^ R
C:\CAB&SIGN\CABARC -s 61448 N; P1 R- G& r4 D: |0 `
n MYCTL.CAB NEEDED1.DLL NEEDED2.DLL MYCTL.OCX MYCTL.INF
8 ~- ~; m M& B$ J8 o
1 X- O/ _% U2 a8 O2 {0 S- T CABARC 创建了一个名为MYCTL.CAB的CAB文件。 ; q, k, D7 e6 a# A+ | G
+ v3 C! J# G5 O1 A* |# p
您必须在您的源文件(INF、OCX以及DLL文件)目录下面运行CABARC。存档在CAB 文件中的文件需要在命令行列出,次序同它们在INF文件中的完全一致。在上例中,INF文件的列出次序是NEEDED1.DLL,然后 是NEEDED2.DLL,最后是MYCTL.OCX。 ( M( w! Q9 o$ t- i( W
5 }( {$ w# k$ ]! t: j: E6 c -s选项为代码签署保留空间。n 命令指定您想创建的是CAB文件。CABARC 命令和选项的说明可以查看,其方式是在命令行键入CABARC:
! T: T I: i2 ?0 e: y k: p$ x/ p; [) z: q. B% G5 ]0 }
C:\CAB&SIGN\CABARC
) f( ?' H+ n: T0 B5 M) e9 q& Y9 u9 c: N) v# N
创建一个INF文件
8 Y5 T2 ~3 A1 f7 F) Y% `9 L# i0 Y9 i
INF文件是一个文本文件,指定运行控件所需要下载或者呈交的文件(比如DLL或者其它OCX)。一个INF文件就捆绑了CAB压缩文件所有的必须文件。 缺省情况下,与现有硬盘中文件版本号相同的文件不被下载。要了解有关INF文件及其选项(包括如何创建独立于平台的INF文件)的详细情况,请参考万维网站Packaging Component Code for Automatic Download,或者参考平台软件开发工具包(Platform SDK,包含在Visual C++ 5.0联机文档中)的设置和系统管理服务(Setup and System Management Services)部分的\Setup API\Overview\INF Files目录下的内容。
: Z, \7 e }/ o2 {. v; F
0 S$ d8 F/ }/ [9 V- L" g" z8 L" J# f9 j 作为示例,下面的INF是用来为ATL多边形控件创建一个CAB文件的。 您可以通过从Visual C++ 5.0光盘下载ATL POLYGON示例程序来创建POLYGON.DLL,并创建一个最小版本。创建该最小版本另外需要一个DLL即 ATL.DLL。ATL.DLL要先于POLYGON.DLL注册,因此首先把ATL.DLL 放置到INF当中。
, Y9 P v7 l' W/ Z. L P- a4 s
. U) [: |- L' S% s; Sample INF file for POLYGON.DLL2 R& `3 j0 l9 r! v
[version] 9 J6 I% d6 g6 V" K G$ D' C
; version signature (same for both NT and Win95) do not remove
* B0 m. l& x" e6 {- Bsignature="$CHICAGO$"( o f9 ~- }8 C' r
AdvancedINF=2.0
2 ]) f7 N( M' I) ^. O" B/ N
- L" X$ E" b$ _, a[Add.Code]
+ N( q. v7 v: O2 P; R& [, @1 ~polygon.dll=polygon.dll
; _. I% h+ Y, h1 aatl.dll=atl.dll; v0 e* O& b4 X; V
/ D4 |$ M a1 l' y# E; needed DLL% U8 B% x) `0 a
[atl.dll]
9 D. J8 L- g7 ]8 \; j0 pfile-win32-x86=thiscab( E! u7 `+ m. i* J
FileVersion=2,00,0,7024
/ `) f: S+ i) G$ o( BDestDir=11! j1 n; i1 g! _+ U, u$ ~+ Q: y/ D f& A
RegisterServer=yes
5 _( x4 | d; i( |8 W' G, w; S: R2 S: B: T0 e: {3 O0 M
[polygon.dll]
% \9 ^; l e1 a7 bfile-win32-x86=thiscab
8 R, Q6 B9 a( w& Xclsid={4CBBC676-507F-11D0-B98B-000000000000} & t. x. s; R/ ]* _
FileVersion=1,0,0,1 - e# ^9 ]# Q% r, K8 f7 j
RegisterServer=yes9 i. C/ F, R0 P9 T
; end of INF file 3 n" N D; G+ F/ [, }4 D: A
9 \8 L9 H5 H; m5 b: W- B 该INF指定了系统需要安装特定版本的ATL.DLL。如果系统中还没有该文件,则需要从和该INF一起创建的CAB文件下载。"thiscab" 是一个关键字,意指包含该INF的CAB文件。您也可以从网上下载所需要的DLL文件,只要指定一个HTTP 网址即可,绝对路径或者相对路径都可以,比如:
8 S) w2 Z' } m# g) C+ x5 Z2 }* Y
, f5 E1 T7 C- R/ Y7 b file-win32-x86=http://www.mysite.com/mydir/NEEDED.DLL
7 K6 W- |' o' ~* ~$ x3 z! g
5 d, u% N$ D; i/ e \6 S 关键字"file-win32-x86" 指定平台是 x86。
* P# H- \8 X, x, a, Z# B
: R/ [' }; c: g# F9 u: |4 P 得到一个文件的版本号的过程是:在Windows NT或者Windows 95 Explorer中右键点击该文件;从弹出列表中选择Properties,然后在接着弹出的对话框中选择版本标签。有时,您可能需要在文件版本中插入一个额外的0 。比如,对话框中显示ATL.DLL的版本号是2.00.7024,在INF文件中则变为2,00,0,7024 。 ) e7 Q% j$ R4 G
( G; }; x+ L4 f3 Z
"DestDir"指的是装载目录或者文件的地址: 11 指定为系统目录 WINDOWS/SYSTEM 或者 WINNT/SYSTEM32; 10 规定为窗口目录、WINDOWS或者WINNT。如果没有指定DestDir(典型情况),则代码从固定的OCCACHE目录装载。
/ Z/ p8 }( h( C1 V
. U. e' @% h! B( c6 ~5 q B$ ?) J "clsid" 指的是要安装控件的CLSID。 * c! T% u" q' o4 |+ m' C
6 M Y0 P# q+ H6 _2 N; d6 I) d# } 创建 INF文件后,再运行CABARC公用程序(在Visual C++ 5.0光盘上的CAB&SIGN目录中)创建CAB文件。您必须在您的源文件目录下面运行CABARC。存档在CAB 文件中的文件需要在命令行列出,次序同它们在INF文件中完全一致。比如,从上面的INF文件为多边形控件做一个CAB文件,需要使用下面的命令 : " r- X' g& h- u H0 ?$ n) o
7 p, X! n7 D% h
C:\CAB&SIGN\CABARC -s 6144 POLYGON.CAB ATL.DLL POLYGON.DLL POLYGON.INF
) k* L( T5 S O; X6 ?( n9 b! _) S6 ~# H! L) @
该CAB文件包含ATL.DLL和POLYGON.DLL的压缩版本,以及将它们展开到POLYGON.INF 文件所需要的信息。
: l, [ g7 H$ `+ h& ]1 ?" u( s3 \3 D5 j3 z0 l$ N
有关创建一个下载MFC控件的CAB文件的示例,请参考MFC 4.2b Component Download Information.您需要包含在MFC控件中的DLL文件有MSVCRT.DLL,MFC42.DLL以及 OLEPRO32.DLL。
' J& m9 a; u# x7 U! Z- p" B% P9 g. g- k: t+ |5 x. v6 r
签署一个CAB文件
* g+ u- X V# z. g$ E0 h2 l( X2 U
使用Code Signing Wizard签署一个CAB文件:
0 G5 d7 e% z w" I+ g z( Q. v$ ]9 l/ j* p$ P
1. 运行公用程序 SIGNCODE (在Visual C++ 5.0光盘的CAB&SIGN 目录下),启动Code Signing Wizard。
+ ^9 T" w# V3 J* U1 Z
- S! X8 P _+ O0 |; |& E# U. x C:\CAB&SIGN\SIGNCODE8 }0 S! }$ r& m: ]6 Z
! v. `- N0 U; g
2. 在Code Signing Wizard对话框当中,点击Next前进到下一页。 0 G+ Y% q# e% d+ b7 G8 ]
9 J; [* |* g+ i' j+ D( P
3. 在您想签署那一个程序? 编辑框中,键入您想签署的CAB文件。 ) _0 R) d. e9 ?4 g* D* C* i3 v6 F
- ?1 g& j" l0 K8 h" W3 w 4.在您想在证书中使用什么名字? 编辑框中,键入您想在证书中使用的名字。
, x& [& ~6 B- z% ]( x1 x
7 c ?7 Y/ x: ^# H8 [! ^: R$ \) v! Z$ Y
5. 点击Next,前进到下一页。
2 z! e# \% R7 ?8 P0 |) I6 N( b
; v% h3 s# j& }# t7 U 6. 在 您想将该程序签署在哪一个软件开发商证书下面? 编辑框中,键入软件开发商证书(SPC)文件名。 : l/ ?: { |5 z1 } ^2 U
! p! }" ~( g+ a% v2 o" z! |7 {
7. 在您要在该证书的哪一个文件中查找密码、密匙? 编辑框中,键入私人密匙(PVK)文件名。 : G3 e6 i8 j5 c) ^
6 t' y9 }7 {. \) u7 x 8. 连续两次点击 Next前进到最后一页。
1 C; z1 L. K% `" W' a
% f& I3 D7 Y- v. F; Z0 H 9.点击Sign,签署CAB 文件。您的文件将被数字化签署。
5 d' y. {8 |: x1 B* I' o) b) @; [5 E% y B3 F& a' K
您可以不使用CAB文件直接签署您的DLL和OCX 。CAB文件的好处在于它是压缩的,而且,如果和INF文件一起使用,可以将所有必要代码捆绑在一起。 8 C) w$ q3 }5 w% |5 g% m4 i
9 _# U, i9 D- q 将签署过的 CAB文件嵌入一个Web页% g/ | T3 o1 R; W5 [+ J
$ K% X3 P- M% @/ r ATL和MFC控件使用标签嵌入网页。在标签,您需要为该控件指定三个属性 :
5 G* L' ^) m5 _0 V' d0 S+ f! {; x, p1 o. ~4 o" R
ID - 控件名称
% W9 U t; k) @1 K e
% I- _ z* p+ D$ S: }( \4 `2 j CLASSID - 控件的CLSID + j& n0 l, O/ E6 |! x5 I
9 S" R5 t3 ^6 s, d% ^6 F) {- X
CODEBASE - 下载控件的位置。CODEBASE 可以指向许多不同的文件类型。 $ v, q& ?8 r8 q# A' x, |' n2 Z+ O
( u! d' N5 {, {+ E! j# R$ a0 E
CODEBASE可以直接指向一个OCX 文件或者DLL文件: . G4 c4 B, K- A2 I7 O2 Y
% {4 v1 q Z/ f9 B6 [
CODEBASE="http://www.mysite.com/mydir/polygon.dll#version=1,0,0,1" 1 K# a# l. J+ D( W: _# [6 K
^- q3 G3 J* {% a, D1 }2 E- _5 k 因为这仅仅完成了DLL或OCX文件的下载和安装,任何必要的DLL支持必须已经装载到了客户机上。 6 ^. k- ], S9 Z$ h* j& S
2 y1 ^1 T, B& B8 K 如果您在CAB文件中包含了选项版本号,它应该指向要下载的控件。例如,如果POLYGON.DLL有一个版本号1,0,0,1,则CAB文件的版本号也必须是1,0,0,1:
2 N T8 g. T5 Y1 ]: [" g/ K. Q( N5 ^+ M& G/ h& M) ~7 `' Q3 [9 X
CODEBASE="http://www.mysite.com/mydir/polygon.cab#version=1,0,0,1" " a% [- Y( m p9 W
( A+ L( B# ?" e' P, N 如果您没有包含选项版本号,则不能替换同一个组件(如果它们出现在客户机上的话)的老版本号。 |
|